[英]Java Regular Expression: what is “ '- ”
我来到了使用正则表达式的java中的一行。 需要用户输入姓氏
return lastName.matches( "[a-zA-z]+([ '-][a-zA-Z]+)*" );
我想知道['-]的功能是什么。 另外,为什么我们同时需要一个“ +”和一个“ *”,并且['-] [a-zA-Z]放在括号中?
您的RE是: [a-zA-z]+([ '-][a-zA-Z]+)*
我将其分为几个组成部分:
[a-zA-Z]+
字符串必须以任何字母az
或AZ
开头,重复一次或多次( +
)。
([ '-][a-zA-Z]+)*
[ '-]
<space>
, '
或-
任何单个字符。
[a-zA-Z]+
同样,任何字母az
或AZ
重复一次或多次。
字母( '-
和a-ZA-Z
)的组合然后可以重复零次或更多次。
为什么[ '-]
? 允许使用小写的名称(例如Higgs-Boson
或带撇号的名称(例如O'Reilly
)或带空格的名称(例如Van Dyke
。
表达式[ '-]
意思是“其中一个'
, 或者
-
”的顺序是非常重要的-仪表板必须是最后一个,否则字符类将被视为一个范围,并与空间和报价之间的代码点其他字符'
将被接受为好。
+
表示“一个或多个重复”; *
表示“零个或多个重复”,指+
或*
修饰符之前的正则表达式。
总体而言,该表达式匹配由空格,破折号或单引号分隔的小写和大写字母组成的组。
这意味着它可以是space
'
或-
(空格,引号)中的任何字符
-
可以做为\\-
因为它也可以表示范围...例如az
看起来这是匹配双桶(空格或连字符)或我不知道该如何调用的名称(例如O'Grady
...例如:
它会匹配
counter-terrorism
De'ville
O'Grady
smith-jones
smith and wesson
但这不匹配
jones-
O'Learys'
#hashtag
Bob & Sons
这个想法是,在第一个[A-Za-z]+
消耗掉所有可能的字母之后,除非下一个字符是空格,撇号或连字符( [ '-]
),否则匹配将在那里结束。 如果存在这些字符之一,则必须在其后至少再加上一个字母。
很多人对此有困难。 天真地写类似[A-Za-z]+[ '-]?[A-Za-z]*
,弄清楚分隔符和多余的字母块都是可选的。 但是它们不是独立地可选的。 如果有分隔符( [ '-]
),则必须后面再加上至少一个字母。 否则,它将像R'- j'-'
这样的字符串视为有效。 您的正则表达式没有这个问题。
顺便说一下,您的正则表达式中有一个错字: [a-zA-z]
。 您需要注意这一点,因为[Az]
确实匹配所有大写和小写字母,因此只要输入有效,它似乎就可以正常工作。 但它也匹配几个非字母字符,它们的代码点恰好位于Z
和a
字符之间。 而且很少有IDE或正则表达式工具会捕获该错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.