2010-09-01 187 views
244

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

+45

你对字符的定义是什么? ASCII?汉子? ISO-XXXX-X? UTF8? – 2010-09-01 12:10:11

+33

您对“正则表达式”的定义是什么? Perl的? Emacs的? grep的? – 2010-09-01 12:17:24

回答

264

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

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

+69

这是一个非常以ASCII为中心的解决方案。这几乎会打破任何非英文文本。 – 2010-09-01 12:13:14

+6

@Joachim Sauer:它宁可打破使用非拉丁字符的语言。 – Gumbo 2010-09-01 12:17:59

+8

德语文本的90%已经打破了,甚至不提法文或西班牙文。尽管意大利人仍然可以做得很好。 – 2010-09-01 12:22:32

127

\p{L}匹配任何是一个Unicode字母,如果你有兴趣字母超越拉丁一个

+0

并非所有正则表达式。例如,vim正则表达式将'\ p'视为“可打印字符”。 – 2010-09-01 12:12:28

+3

那么在支持unicode的,然后正则表达式 – RobV 2010-09-01 12:13:19

+1

[此页]任何正则表达式引擎(http://www.regular-expressions.info/refflavors.html)认为只有Java中,.NET,PERL,jgsoft,XML和XPath的正则表达式的支持\ p {L}。但重大遗漏:python和ruby(尽管python有正则表达式模块)。 – 2010-09-01 12:16:33

32

根据你的 “个性” 的含义:

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

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

+0

我的意思是说。它似乎没有工作。 preg_match('/ [a-zA-Z] + /',$ name); – Nike 2010-09-01 12:19:01

+0

[A-Za-z]只是您可以使用的字符声明。您仍然需要声明如何使用此声明:[A-Za-z] {1,2}(匹配1或2个字母)或[A-Za-z] {1,*}(以匹配1个或多个字母) – Molske 2010-09-01 13:06:41

+6

井A,A,A,O,A ......是信了,所以是অ,আ,ই,ঈ,Є,Ж,З,ح,خ,دא,ב,ג,ש ,ת,... https://en.wikipedia.org/wiki/Letter_%28alphabet%29 – 2016-09-20 09:50:37

10

对于PHP,下面如果你的意思是何字符编码的任何信件将正常工作

'/^[a-zA-Z]+$/' 
2

,然后一个很好的办法可能是删除非字母状空间\s,数字\d,以及其他特殊字符,如:

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

或使用以上否定之否定直接描述的信:

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

优点:

  • 适用于所有的正则表达式的口味。
  • 易写,有时节省很多时间。

缺点:

  • 长,有时并不完美,但字符编码也可被打破。
3

只需使用\w[:alpha:]。这是一个转义序列,它只匹配可能出现在文字中的符号。

+5

在所有情况下,'\ w'可能不是一个好的解决方案。至少在PCRE中,'\ w'也可以匹配其他字符。引用[PHP手册](http://uk3.php.net/manual/en/regexp.reference.escape.php):“*”单词“字符是任何字母或数字或下划线字符,也就是说,任何可以成为Perl“单词”一部分的字符字母和数字的定义由PCRE的字符表来控制,如果发生特定于语言环境的匹配,字母和数字的定义可能会有所不同,例如,在“fr”(法语)区域设置,一些大于128的字符代码用于重音字母,并且这些符号由\ w。*“匹配。 – 2014-06-08 19:56:26

+0

词包括字母 – 2015-05-15 03:05:55

+2

其他字符'\ w'意味着匹配的字母和数字 – 2016-08-26 16:10:33

0

图案=/[A-ZA-Z]/

看跌期权 “[1 - ZA-Z]:#{pattern.match(” 矿开花 “)}” OK

看跌期权“[一个-ZA-Z]:#{pattern.match( “456”)} “

看跌期权 ”[1 - ZA-Z]:#{pattern.match(“ ”)}“

看跌期权” [a-zA-Z]:#{pattern.match(“#$%^ & *”)}“

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

2

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

+0

这不是什么'[^ \ W | \ d]'意味着 – OGHaza 2014-07-25 13:34:24

+0

'[^ \ W | \ d]'表示不'\ W'而不是'|'而不是'\ d'。它具有相同的净效果,因为'|是'\ W'的一部分,但是'|'不像你认为的那样工作。即便如此,这意味着它接受'_'字符。您可能正在寻找'[^ \ W \ d_]' – OGHaza 2014-07-25 14:47:32

+0

我同意你的意见,它接受'_'。但是, “NOT”'|'大于等于 “AND”,所以'[^ \ W | \ d]'表示:NOT'\ W' **和**不是'\ D' – Motlab 2014-07-25 15:01:18

24

最近的可用选项是

[\u\l]+ 

其中的大写和小写字母的顺序一致。但是,并非所有的编辑器/语言的支持,所以它可能是更安全的使用

[a-zA-Z]+ 

其他用户建议

+0

虽然不匹配任何特殊字符。 – Nyerguds 2016-05-25 06:25:14

5

你会使用

/[a-z]/gi 

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

az ---涵盖整个字母表

g --- --globally在整个字符串

我-----越来越大写和小写

-2
Pattern pattern = Pattern.compile("^[a-zA-Z]+$"); 

if (pattern.matcher("a").find()) { 

    ...do something ...... 
} 
7

这几个人写的正则表达式 “/^[A-ZA-Z] $ /我”是不正确的,因为在最后,他们都提到/我这是不区分大小写并首次将返回匹配之后。代替/我只是使用/克这是全球性的,你也没有任何需要把^$为开始和结束。 [_ A-Z] +匹配单个字符存在于低于

  • 量词列表

    /[a-zA-Z]+/g 
    
    1. +之间一个和无限次,多次地,用之于根据需要
    2. AZ的范围内的单个字符a和z(区分大小写)
    3. AZ之间的单个字符在A和Z(区分大小写)
    4. 改性剂之间的范围内:全球。所有的比赛(不上的第一场比赛返回)
  • -1
    String string= "abcdef"; 
    
    if(string.match("^[a-zA-Z]+$$")){ 
        System.out.println("string only contains letters"); 
    } 
    
    5

    使用字符组

    \D 
    

    匹配除数字0-9

    ^\D+$ 
    

    见例如here

    任何字符
    +0

    这也将匹配空白,符号等,这似乎不是问题的要求。 – DaveMongoose 2018-01-02 09:31:30

    相关问题