Java正则表达式以匹配模式,或模式中的任何子字符串
我正在处理一个正则表达式模式,它将匹配一个模式,或者该模式的任何子字符串,发生在字符串的末尾。虽然我下面的方法很好用,也很容易理解,但我相信一定有更优雅的方法来做到这一点。我已经研究了边界匹配和量词,但没有找到一个很好的方法将它们混合在一起,得到这样的结果。有什么想法吗Java正则表达式以匹配模式,或模式中的任何子字符串,java,regex,Java,Regex,我正在处理一个正则表达式模式,它将匹配一个模式,或者该模式的任何子字符串,发生在字符串的末尾。虽然我下面的方法很好用,也很容易理解,但我相信一定有更优雅的方法来做到这一点。我已经研究了边界匹配和量词,但没有找到一个很好的方法将它们混合在一起,得到这样的结果。有什么想法吗 regex = (_part_\d+$|_part_$|_part$|_par$|_pa$|_p$|_$) aString_part_1 - match aString_part_ - match aString_par
regex = (_part_\d+$|_part_$|_part$|_par$|_pa$|_p$|_$)
aString_part_1 - match
aString_part_ - match
aString_part - match
aString_par - match
aString_pa - match
aString_p - match
aString_ - match
aString - no match
您的匹配条件似乎非常广泛,以下任何一项都将匹配:
foobar
。
\u第00000000部分
\uuuuuuuuuuuuuuu
regex=\u(?:p(?:a(?:r(?:t(?:\d*)?)?)?)?$
可以说,这并不比这更优雅。如果省略消音器,则可以编写:regex=p(a(r(t(\d*)?)?)?)?)?$
,这实际上可读性更强,但性能稍差
如果您愿意放弃字符的完整性,那么您也可以编写regex=\u p?a?r?t?\ud*$
,但这样您就会认为以下操作也会起作用:
\u pt5
\u pat\u 69
\uuu 666
提示:该页面对于学习正则表达式和调试它们非常有用。java风格不包含在内,但pcre在大多数情况下都足够接近。您所拥有的一切都很好,但您可能会考虑到
$
,我不理解捕获组的用途。另一种方式,我个人也不喜欢,是\u(?:p(?:a(?:r(?:t(?:t(?::::::::::::::::::?)?)?)?$
。如果你算出(如果我可以使用这个表达式的话),剩下的是(:part\ud+| part\u124; part | part | par | pa | p)$
@卡里斯沃维兰是对的。但是,这将从小组的前面解释。
。它仍然是必需的,但不是第1组的一部分。但是,由于它是修复的,并且包含在常规匹配中,因此您可以将其忽略。相应地修改了我的答案。@TreffnonX,你可以排除,甚至可以分解,\uuu
,但解释它永远不会起作用@CarySwoveland Nice,但我有2点意见:1)在第一个示例中,最里面的(?:\d)?
是错误的,因为您错过了+
,所以应该是(?:\d+)
,可以缩短为\d*
--2) 在第二个示例中,前两个选项可以合并,即part\ud+| part\uuu
→ <代码>部分\ud*——在这两种情况下,\d+
→ <代码>\d*简化了正则表达式。