正则表达式仅匹配字母


374

如何编写仅与字母匹配的正则表达式?


58
您对的定义是characters什么?ASCII?汉子?iso-XXXX-X?UTF8?
Ivo Wetzel'9

45
您对的定义是regex什么?Perl?埃马克斯?Grep?
Pascal Cuoq'9

4
鉴于问题是英语的,因此在英语站点上,可以假设问题是英语字符。
vaer-k

1
我注意到一个字母的\ p {L}和Unicode的/ u标志匹配我的正则表达式中的任何字母,即/\p{L}+/u
MaxZoom

4
Given that the question is in English, on an English site, it's fair to assume the question regards characters in English. 这是真的。众所周知,英语使用者永远不会本地化他们的应用程序!
亚历克斯

Answers:


392

使用字符集:[a-zA-Z]以小写和大写形式匹配A–Z中的一个字母。[a-zA-Z]+匹配一个或多个字母,并且^[a-zA-Z]+$仅匹配仅包含一个或多个字母的字符串(^并分别$标记字符串的开头和结尾)。

如果要匹配A–Z以外的其他字母,则可以将它们添加到字符集中:[a-zA-ZäöüßÄÖÜ]。或者,您可以使用预定义的字符类,例如Unicode字符属性\p{L},它描述了字母的Unicode字符。


119
这是一个非常以ASCII为中心的解决方案。这几乎会破坏所有非英语文本。
Joachim Sauer 2010年

7
@Joachim Sauer:宁愿在使用非拉丁字符的语言上中断。
Gumbo'9

15
90%的德语文本已经中断,甚至没有提及法语或西班牙语。意大利语可能仍然做得不错。
Ivo Wetzel'9

9
这取决于您选择的“拉丁字符”的定义。根据您的定义,J,U,Ö,Ä都可以被认为是拉丁字符或不是拉丁字符。但是它们全都用于使用“拉丁字母”进行书写的语言中。
Joachim Sauer

9
\ p {L}与所有变音符的sedilla口音匹配,因此您应该这样做。
Radu Simionescu

198

\p{L} 如果您对拉丁字母以外的字母感兴趣,则匹配Unicode字母的任何东西


2
并非所有正则表达式都适用。例如,vim正则表达式被\p视为“可打印字符”。
菲利普·波特

3
该页面建议仅Java,.net,perl,jgsoft,XML和XPath正则表达式支持\ p {L}。但是主要的遗漏是:python和ruby(尽管python有regex模块)。
菲利普·波特

6
@Philip Potter:Ruby使用完全相同的语法支持Unicode字符属性。
约尔格W¯¯米塔格

6
我认为这应该\p{L}\p{M}*+涵盖由多个代码点组成的字母,例如,字母后面带有重音符号。按照regular-expressions.info/unicode.html
ZoFreX

与python 3这会产生一个错误bad escape \p at position 0
Matanster '19

46

根据您对“字符”的含义:

[A-Za-z]-所有字母(大写和小写)

[^0-9] -所有非数字字符


我是说字母 它似乎没有起作用。preg_match('/ [a-zA-Z] + /',$ name);
耐克

[A-Za-z]只是可以使用的字符声明。您仍然需要声明必须使用此声明多少次:[A-Za-z] {1,2}(匹配1或2个字母)或[A-Za-z] {1,*}(匹配1个或多个字母)
KristofMols 2010年

17
à,á,ã,Ö,Ä...也都是字母,are,আ,ই,ঈ,Є,Ж,Є,З,,ﺥ,ﺩא,ב,ג,,ת,... en.wikipedia.org/wiki/Letter_%28alphabet%29
phuclv

@phuclv:的确如此,但这取决于编码,编码是程序设置的一部分(默认配置或在程序的配置文件中声明的设置)。当我使用不同的语言时,我曾经将其存储在一个常量中,并保存在配置文件中。
卡塔琳娜·奇尔库

1
@CatalinaChircu编码在这里绝对无关。编码是一种以二进制形式对字符集中的代码点进行编码的方式,例如UTF-8是Unicode的编码。字母OTOH取决于语言,如果有人说[A-Za-z]字母是字母,则必须指定所使用的语言
phuclv

32

最接近的可用选项是

[\u\l]+

匹配一系列大写和小写字母。但是,并非所有编辑器/语言都支持它,因此使用起来可能更安全

[a-zA-Z]+

如其他用户建议


1
但是不会匹配任何特殊字符。
Nyerguds

20

你会用

/[a-z]/gi

[]-检查给定输入之间的任何字符

az--覆盖整个字母

g -----遍及整个字符串

i ----获取大写和小写


14

很少有人写成“ / ^ [a-zA-Z] $ / i”的正则表达式是不正确的,因为最后他们提到了/ i,它不区分大小写,并且在首次匹配后会返回。取而代之的/我只是使用/ G是全球,你也没有任何必要把^ $开始和结束。

/[a-zA-Z]+/g
  1. [a-z _] +匹配下面列表中存在的单个字符
  2. 量词:+一次至无限次,尽可能多次,并根据需要返回
  3. az介于a和z之间的单个字符(区分大小写)
  4. AZ在A到Z之间的单个字符(区分大小写)
  5. g修饰符:全局。所有比赛(在第一个比赛中不返回)

13

Java:

String s= "abcdef";

if(s.matches("[a-zA-Z]+")){
     System.out.println("string only contains letters");
}

4
它不包含变音符号,例如ŹŻŚĄ
karoluS




6

只需使用\w或即可[:alpha:]。它是一个转义序列,仅匹配可能出现在单词中的符号。


9
\w并非在所有情况下都是一个好的解决方案。至少在PCRE中,\w也可以匹配其他字符。引用PHP手册:“ “单词”字符是任何字母或数字或下划线字符,即可以成为Perl“单词”一部分的任何字符。字母和数字的定义由PCRE的字符表控制,例如,在“ fr”(法语)语言环境中,某些大于128的字符代码用于带重音的字母,而这些字符代码用\ w。进行匹配
阿马尔·穆拉利

单词包含字母中的其他字符
V-SHY

2
\w表示匹配的字母和数字
Eugen Konkov

4

如果您用任何字符编码表示任何字母,那么一种好方法可能是删除非字母,例如空格\s,数字\d和其他特殊字符,例如:

[!@#\$%\^&\*\(\)\[\]:;'",\. ...more special chars... ]

或使用上述否定的否定词直接描述任何字母:

\S \D and [^  ..special chars..]

优点:

  • 适用于所有正则表达式。
  • 易于编写,有时可以节省大量时间。

缺点:

  • 很长,有时并不完美,但是字符编码也可能被破坏。

4

您可以尝试使用以下正则表达式:[^\W\d_][a-zA-Z]


那不是什么[^\W|\d]意思
OGHaza 2014年

1
[^\W|\d]表示不\W,不|,不\d。它具有相同的净效果,因为它|是其中的一部分,\W|无法按您认为的那样起作用。即使那样也意味着它接受_字符。您可能正在寻找[^\W\d_]
OGHaza

我同意您的意见,它接受_。但是“ NOT” |等于“ AND”,因此[^\W|\d]意味着:NOT \W AND NOT\d
Motlab 2014年

12
[^ab]表示不a,不是b[^a|b]表示不a,不|,不b。再举一个例子[a|b|c|d][abcd|||]它和完全一样[abcd|]-所有等于([a]|[b]|[c]|[d]|[|])|都是文字字符,而不是OR运算符。OR运算符隐含在字符类中的每个字符之间,这实际上|意味着您希望该类接受|(竖线)字符。
OGHaza 2014年

1

最近,我在表单中使用了这种模式来检查人员姓名,其中包含字母,空格和带重音符号的特殊字符。

pattern="[A-zÀ-ú\s]+"

您应该看一下ASCII表。A-z不仅可以匹配字母,还可以匹配À-ú
Toto

0

模式= / [a-zA-Z] /

放置“ [[a-zA-Z]:#{pattern.match(“ mine Blossom”)}“”确定

放置“ [a-zA-Z]:#{pattern.match(“ 456”)}“

放置“ [a-zA-Z]:#{pattern.match(“”)}“”

放置“ [a-zA-Z]:#{pattern.match(“#$%^&*”)}“

将“ [a-zA-Z]:#{pattern.match(“#$%^&* A”)}“确定


3
例如,“Zażółćgęsląjaźń”呢?
见证人

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.