如何编写仅匹配字母的正则表达式?
characters
的定义是什么? ASCII?汉子?异-XXXX-X? UTF8?
regex
的定义是什么?珀尔?埃马克斯?格力普?
/\p{L}+/u
使用字符集:[a-zA-Z]
匹配 A–Z 中的一个小写和大写字母。 [a-zA-Z]+
匹配一个或多个字母,而 ^[a-zA-Z]+$
仅匹配仅包含一个或多个字母的字符串(^
和 $
分别标记字符串的开始和结束)。
如果要匹配 A–Z 以外的其他字母,可以将它们添加到字符集中:[a-zA-ZäöüßÄÖÜ]
。或者您使用预定义的字符类,例如描述作为字母的 Unicode 字符的 Unicode character property 类 \p{L}
。
如果您对拉丁字母以外的字母感兴趣,\p{L}
匹配任何 Unicode 字母
\p
视为“可打印字符”。
\p{L}\p{M}*+
来覆盖由多个代码点组成的字母,例如一个字母后跟重音符号。根据regular-expressions.info/unicode.html
u
来检测 unicode 组:/\p{Letter}/gu
根据您对“字符”的含义:
[A-Za-z] - 所有字母(大写和小写)
[^0-9] - 所有非数字字符
[A-Za-z]
是字母,则必须指定正在使用的语言
最接近的选项是
[\u\l]+
它匹配一系列大写和小写字母。但是,并非所有编辑器/语言都支持它,因此使用起来可能更安全
[a-zA-Z]+
正如其他用户建议的那样
你会用
/[a-z]/gi
[]--检查给定输入之间的任何字符
az---覆盖整个字母表
g-----在整个字符串中全局
i-----获取大小写
爪哇:
String s= "abcdef";
if(s.matches("[a-zA-Z]+")){
System.out.println("string only contains letters");
}
ŹŻŚĄ
很少有人写成“/^[a-zA-Z]$/i”的正则表达式是不正确的,因为最后他们提到了/i,这是不区分大小写的,在第一次匹配后它会返回。而不是 /i 只使用 /g 这是全局的,你也不需要把 ^ $ 用于开始和结束。
/[a-zA-Z]+/g
[a-z_]+ 匹配下面列表中的单个字符 量词:+ 一次到无限次之间,尽可能多次,根据需要返回 az 在 a 和 z 之间范围内的单个字符(区分大小写) AZ A 和 Z 之间的单个字符(区分大小写) g 修饰符:全局。所有比赛(第一场比赛不返回)
对于 PHP,以下将正常工作
'/^[a-zA-Z]+$/'
在python中,我发现以下工作:
[^\W\d_]
这是有效的,因为我们正在创建一个新的字符类([]
),它排除了(^
)类 \W
中的任何字符(所有不在 [a-zA-Z0-9_]
中的字符),也排除了任何数字(\d
)和也不包括下划线 (_
)。
也就是说,我们采用了字符类 [a-zA-Z0-9_]
并删除了 0-9
和 _
位。您可能会问,写 [a-zA-Z]
而不是 [^\W\d_]
不是更容易吗?如果只处理 ASCII 文本,你会是正确的,但在处理 unicode 文本时:
\W 匹配任何不是单词字符的字符。这与 \w 正好相反。 > 如果使用 ASCII 标志,则它等效于 [^a-zA-Z0-9_]。
^ 来自 the python re module documentation
也就是说,我们将所有被认为是 unicode 中的单词字符,删除所有被认为是 unicode 中的数字字符,并删除下划线。
例如,下面的代码片段
import re
regex = "[^\W\d_]"
test_string = "A;,./>>?()*)&^*&^%&^#Bsfa1 203974"
re.findall(regex, test_string)
退货
['A', 'B', 's', 'f', 'a']
çéàñ
。您的正则表达式的可读性低于 \p{L}
只需使用 \w
或 [:alpha:]
。它是一个转义序列,仅匹配可能出现在单词中的符号。
\w
可能不是在所有情况下都是好的解决方案。至少在 PCRE 中,\w
也可以匹配其他字符。引用 PHP manual:““单词”字符是任何字母或数字或下划线字符,即可以成为 Perl“单词”一部分的任何字符。字母和数字的定义由PCRE 的字符表,如果进行特定于语言环境的匹配,可能会有所不同。例如,在“fr”(法语)语言环境中,一些大于 128 的字符代码用于重音字母,这些字符由 \w 匹配。< /i>”。
\w
表示匹配字母和数字
如果您指的是任何字符编码中的任何字母,那么一个好的方法可能是删除非字母,如空格 \s
、数字 \d
和其他特殊字符,如:
[!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]
或者使用上述否定的否定来直接描述任何字母:
\S \D and [^ ..special chars..]
优点:
适用于所有正则表达式风格。
易于编写,有时可以节省大量时间。
缺点:
很长,有时并不完美,但字符编码也可能被破坏。
您可以试试这个正则表达式:[^\W\d_]
或 [a-zA-Z]
。
[^\W|\d]
的意思
[^\W|\d]
表示不是 \W
,也不是 |
,也不是 \d
。它具有相同的净效果,因为 |
是 \W
的一部分,但 |
不像您想象的那样工作。即使这样,这也意味着它接受 _
字符。您可能正在寻找 [^\W\d_]
_
。但是“NOT”|
等于“AND”,所以 [^\W|\d]
表示:NOT \W
AND NOT \d
[^ab]
表示不是 a
也不是 b
。 [^a|b]
表示不是 a
,也不是 |
,也不是 b
。举第二个例子,[a|b|c|d]
与 [abcd|||]
完全相同,它与 [abcd|]
完全相同 - 所有这些都等同于 ([a]|[b]|[c]|[d]|[|])
,|
是文字字符,而不是 OR 运算符。 OR 运算符隐含在字符类中的每个字符之间,放置一个实际的 |
意味着您希望该类接受 |
(管道)字符。
所以,我一直在阅读很多答案,其中大多数都没有考虑例外情况,比如带有重音符号或分音符号的字母(á、à、ä 等)。
我在 typescript 中创建了一个函数,它应该几乎可以外推到任何可以使用 RegExp 的语言。这是我在 TypeScript 中的用例的个人实现。我基本上所做的就是用我想添加的每种符号添加一系列字母。在应用 RegExp 之前,我还将 char 转换为大写,这为我节省了一些工作。
function isLetter(char: string): boolean {
return char.toUpperCase().match('[A-ZÀ-ÚÄ-Ü]+') !== null;
}
如果您想添加另一个带有另一种重音的字母范围,只需将其添加到正则表达式即可。特殊符号也是如此。
我用 TDD 实现了这个功能,我可以确认它至少适用于以下情况:
character | isLetter
${'A'} | ${true}
${'e'} | ${true}
${'Á'} | ${true}
${'ü'} | ${true}
${'ù'} | ${true}
${'û'} | ${true}
${'('} | ${false}
${'^'} | ${false}
${"'"} | ${false}
${'`'} | ${false}
${' '} | ${false}
最近我在我的表单中使用这种模式来检查人名,包括字母、空格和特殊字符,如重音符号。
pattern="[A-zÀ-ú\s]+"
A-z
不仅匹配字母,还匹配 À-ú
JavaScript
如果要返回匹配的字母:
('Example 123').match(/[A-Z]/gi)
// 结果:[“E”、“x”、“a”、“m”、“p”、“l”、“e”]
如果您想用星号 ('*') 替换匹配的字母,例如:
('Example 123').replace(/[A-Z]/gi, '*')
//结果:"****** 123"*
/\p{Letter}/gu
参考:developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
/^[A-z]+$/.test('asd')
// true
/^[A-z]+$/.test('asd0')
// false
/^[A-z]+$/.test('0asd')
// false
模式 = /[a-zA-Z]/
puts "[a-zA-Z]: #{pattern.match("mine bloom")}" OK
提出“[a-zA-Z]:#{pattern.match("456")}”
提出“[a-zA-Z]: #{pattern.match("")}"
提出“[a-zA-Z]: #{pattern.match("#$%^&*")}”
将 "[a-zA-Z]: #{pattern.match("#$%^&*A")}" 确定
Pattern pattern = Pattern.compile("^[a-zA-Z]+$");
if (pattern.matcher("a").find()) {
...do something ......
}