Java正则表达式:`+;| `及`*`
我跳进了一个自定义输入验证库的现有代码库,该库使用regex模式(以及其他东西) 以下是一个例子:Java正则表达式:`+;| `及`*`,java,regex,Java,Regex,我跳进了一个自定义输入验证库的现有代码库,该库使用regex模式(以及其他东西) 以下是一个例子: final String pattern=“^[a-zA-Z]+|$”; 在我看来,+|(“至少1,或空”)只是一种令人困惑的方式,可以实现与*(“0或更多”)的等价: final String pattern=“^[a-zA-Z]*$”; 我错过什么了吗?使用+|是否可能会提高性能 人们宁愿使用+|的潜在原因是什么? 编辑:因为我测试了评论中提供的答案是否正确,下面是结果的屏幕截图: ^[
final String pattern=“^[a-zA-Z]+|$”;
在我看来,+|
(“至少1,或空”)只是一种令人困惑的方式,可以实现与*
(“0或更多”)的等价:
final String pattern=“^[a-zA-Z]*$”;
我错过什么了吗?使用+|
是否可能会提高性能
人们宁愿使用+|
的潜在原因是什么?
编辑:因为我测试了评论中提供的答案是否正确,下面是结果的屏幕截图:
^[a-zA-Z]+$
匹配字符串开头的一个或多个字母,或者匹配字符串结尾。它与等价性无关^([a-zA-Z]+|$
等于^([a-zA-Z]*)$
@WiktorStribiżew所以你说^[a-zA-Z]+|$
等同于(^[a-zA-Z]+)|($)
?这意味着“a9001
”将匹配该模式,因为字符串的开头确实至少有一个组中指定的字符。很有趣,谢谢你为我澄清这一点!我认为这实际上可能是我们的一些测试失败的原因。在Java中,有两种执行正则表达式的方法:find()
和matches()
。Wiktor Stribiżew的评论假设使用了find()
,它在输入中搜索符合正则表达式的子字符串。后续测试代码使用matches()
,它尝试将整个输入匹配到正则表达式,使得^
和$
冗余,这就是为什么要假设find()
matches()
与regexX
类似于find()
与regex^(X)$
,或者更准确地说,与regex\A(?:X)\z
匹配。除非另有规定,否则regex被假定为在“查找”模式下执行,这就是为什么如果要匹配整个输入,就需要在那里执行^
和$/code>。许多语言只支持“查找”模式,例如,没有与matches()
调用等效的模式。@Andreas感谢您的精确性!因此,如果库实际在内部使用matches()
,我可以删除^
和$
?