Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式以匹配模式,或模式中的任何子字符串_Java_Regex - Fatal编程技术网

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
根据Cary Swoveland的正确提示编辑了问题


提示:该页面对于学习正则表达式和调试它们非常有用。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*简化了正则表达式。