我在java中使用正则表达式。 它需要用户输入姓氏
return lastName.matches( "[a-zA-z]+([ '-][a-zA-Z]+)*" );
我想知道[' - ]的功能是什么。 为什么我们同时需要“+”和“*”,并且[' - ] [a-zA-Z]在括号中?
答案 0 :(得分:4)
您的RE是:[a-zA-z]+([ '-][a-zA-Z]+)*
我会把它分解成它的组成部分:
[a-zA-Z]+
字符串必须以任何字母a-z
或A-Z
开头,重复一次或多次(+
)。
([ '-][a-zA-Z]+)*
[ '-]
<space>
,'
或-
的任何一个字符。
[a-zA-Z]+
同样,任何字母a-z
或A-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]
确实匹配所有大写和小写字母,所以只要输入有效,它就会正常工作。但它也匹配几个非字母字符,其代码点恰好位于Z
和a
之间。很少有IDE或正则表达式工具可以捕获该错误。