繁体   English   中英

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

[英]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]+

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

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

    • [ '-]

    <space>'-任何单个字符。

    • [a-zA-Z]+

    同样,任何字母azAZ重复一次或多次。

    字母( '-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]确实匹配所有大写和小写字母,因此只要输入有效,它似乎就可以正常工作。 但它也匹配几个非字母字符,它们的代码点恰好位于Za字符之间。 而且很少有IDE或正则表达式工具会捕获该错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM