Java 为什么|&引用;(或)在正则表达式中,当用作替换标准时,给出奇怪的结果

Java 为什么|&引用;(或)在正则表达式中,当用作替换标准时,给出奇怪的结果,java,regex,Java,Regex,首先,我不是正则表达式的专家。请看一下这个正则表达式: ([km]u|nya|[kl]ah|pun)$ 我想删除以下字符串中的“nya”和“lah”: diserahkannyalah 它的结果不是“diserahkan”,而是“diserahkannya”。因此,在尝试替换操作时,并非所有条件都满足。 为什么会这样?Im使用Java并使用Matcher中的replaceAll方法您只需添加一个量词: ([km]u|nya|[kl]ah|pun)+$

首先,我不是正则表达式的专家。请看一下这个正则表达式:

([km]u|nya|[kl]ah|pun)$
我想删除以下字符串中的“nya”和“lah”:

diserahkannyalah
它的结果不是“diserahkan”,而是“diserahkannya”。因此,在尝试替换操作时,并非所有条件都满足。
为什么会这样?Im使用Java并使用Matcher中的replaceAll方法

您只需添加一个量词:

([km]u|nya|[kl]ah|pun)+$
                      ^

+
告诉正则表达式引擎重复匹配模式
+
量化1次或多次。这里,量词出现在关闭捕获组的
之后,因此,整个捕获组模式被量化

请注意,如果只是删除所有这些子字符串,则可以使用非捕获组:
(?:[km]u|nya|[kl]ah|pun)+$


有关正则表达式量词的更多详细信息,请参阅。

如果字符串是
FOOnyaBARlah
,您希望得到什么结果?您是对的。非常感谢。这真的很有帮助,而且速度很快。我想补充一点,
[km]u
[kl]ah
可以在同一位置匹配,这在编写备选组时不是一个好主意。虽然在这种情况下,这并不重要(不需要进行“过早优化”),但请记住,组内的所有备选方案不应在同一位置匹配,以确保良好的正则表达式性能。