Java正则表达式:什么是“' - ”

时间:2013-11-08 03:24:15

标签: java regex syntax

我在java中使用正则表达式。 它需要用户输入姓氏

return lastName.matches( "[a-zA-z]+([ '-][a-zA-Z]+)*" );

我想知道[' - ]的功能是什么。 为什么我们同时需要“+”和“*”,并且[' - ] [a-zA-Z]在括号中?

5 个答案:

答案 0 :(得分:4)

您的RE是:[a-zA-z]+([ '-][a-zA-Z]+)*

我会把它分解成它的组成部分:

  • [a-zA-Z]+

    字符串必须以任何字母a-zA-Z开头,重复一次或多次(+)。

  • ([ '-][a-zA-Z]+)*

    • [ '-]

    <space>'-的任何一个字符。

    • [a-zA-Z]+

    同样,任何字母a-zA-Z重复一次或多次。

    这些字母组合('-a-ZA-Z)可能会重复零次或多次。

为什么[ '-]?允许使用带有缩写的名称,例如Higgs-Boson或带有撇号的名称,例如O'Reilly,或带有Van Dyke等空格的名称。

答案 1 :(得分:2)

表达式[ '-]表示“'-之一”。顺序非常重要 - 破折号必须是最后一个,否则字符类将被视为范围,并且在空格和引用'之间具有代码点的其他字符也将被接受。

+表示“一次或多次重复”; *表示“零次或多次重复”,指的是+*修饰符之前的正则表达式的术语。]

总的来说,表达式匹配由空格,短划线或单引号分隔的小写和大写字母组。

答案 2 :(得分:0)

这意味着它可以是任何字符space '-(空格,引用短划线)

-可以\-完成,因为它也可以表示范围......例如a-z

答案 3 :(得分:0)

这看起来像是匹配双管(空格或连字符)的模式,或者我不知道如何调用它的名称,如O'Grady ...例如:< / p>

匹配

counter-terrorism
De'ville
O'Grady
smith-jones
smith and wesson

但它不匹配

jones-
O'Learys'
#hashtag
Bob & Sons

答案 4 :(得分:0)

这个想法是,在第一个[A-Za-z]+消耗所有可能的字母后,匹配将在那里结束,除非下一个字符是空格,撇号或连字符([ '-])。如果其中一个字符存在,则必须至少再跟一个字母。

很多人都有这方面的困难。天真地写出类似[A-Za-z]+[ '-]?[A-Za-z]*的东西,想象分隔符和额外的字母块是可选的。但他们并非独立可选;如果有分隔符([ '-]),则必须后跟至少一个字母。否则,它会将R'- j'-'之类的字符串视为有效。你的正则表达式没有这个问题。

顺便说一下,你的正则表达式中有一个拼写错误:[a-zA-z]。您需要注意这一点,因为[A-z]确实匹配所有大写和小写字母,所以只要输入有效,它就会正常工作。但它也匹配几个非字母字符,其代码点恰好位于Za之间。很少有IDE或正则表达式工具可以捕获该错误。