正则表达式中的奇怪行为

shi*_*t66 4 java regex regex-greedy

有一个关于正则表达式的问题并试图回答我发现了另一个奇怪的事情.

String x = "X";
System.out.println(x.replaceAll("X*", "Y"));
Run Code Online (Sandbox Code Playgroud)

这打印YY.为什么??

String x = "X";
System.out.println(x.replaceAll("X*?", "Y"));
Run Code Online (Sandbox Code Playgroud)

这打印YXY

为什么不情愿的正则表达式与'X'字符不匹配?有"noting"X"nothing"但为什么首先不匹配三个符号并匹配两个然后一个而不是三个?和第二个正则表达式只匹配"nothing"s而不是X

NPE*_*NPE 8

让我们依次考虑它们:

"X".replaceAll("X*", "Y")
Run Code Online (Sandbox Code Playgroud)

有两场比赛:

  1. 在字符位置0处,X匹配,并替换为Y.
  2. 在字符位置1处,匹配空字符串,并将其Y添加到输出中.

最终结果:YY.

"X".replaceAll("X*?", "Y")
Run Code Online (Sandbox Code Playgroud)

还有两场比赛:

  1. 在字符位置0处,匹配空字符串,并将其Y添加到输出中.此位置的字符X未被匹配消耗,因此逐字复制到输出中.
  2. 在字符位置1处,匹配空字符串,并将其Y添加到输出中.

最终结果:YXY.