Java 如何处理与boundry'\\G';?

Java 如何处理与boundry'\\G';?,java,regex,Java,Regex,最近我在学习Java的regex部分,今天我遇到了一个关于boundry\\G使用的问题,下面是我的代码: String input = "abcdec"; System.out.println(String.format("Before :'%s' ; after replace : '%s'", input , input.replaceAll("\\Gx?", "!"))); 在“abcdec”之前打印;替换后:'!abcdec',我不知道它为什么打印这个,在第一次匹配字符串开头

最近我在学习Java的
regex
部分,今天我遇到了一个关于boundry
\\G
使用的问题,下面是我的代码:

  String input = "abcdec";
  System.out.println(String.format("Before :'%s' ; after replace : '%s'", input , input.replaceAll("\\Gx?", "!")));
在“abcdec”之前打印
;替换后:'!abcdec'
,我不知道它为什么打印这个,在第一次匹配字符串开头后,它用字符'!'替换位置,但是为什么不能再次匹配呢?我认为正则表达式“\Gx”可以匹配所有地方

我需要你的帮助,谢谢你的每一个帮助!谢谢。

我引自:
如果您希望一次搜索在上次搜索结束的地方进行,您可以使用“\G”模式元素。
这意味着如果没有执行搜索,\G只会告诉搜索从字符串的开头开始,并在第一次匹配时停止

还有一个。请注意,由于第一次替换没有将起始位置从0移动,因此在字符串的请求中再次添加了感叹号


您对程序的期望是什么?

编辑:好的,明白了。删除了错误的假设


发生的情况是:

  • replaceAll
    从输入的开头开始(索引
    0
  • \G
    匹配初始启动值
    0
  • x
    找不到-没关系,这是有条件的
  • 到了尽头。从
    0
    0
    的首次匹配成功
  • 添加替换件
    到输出
  • 下一次迭代,从下一个字符开始(索引
    1
  • 最后一次匹配的结束时间为
    0
    <代码>\G
    ,应用于位置
    1
    不匹配
  • …穿过整条线,它永远不会匹配
  • 返回输出字符串:
    !abc…

  • 当我读到的最后一个例子时,我更清楚了。

    我只是想测试“\\G”的功能,我在书中遇到了这个问题,我不明白。我不明白的是,在第一次更换之后,为什么它会停止,我认为它应该一次又一次地更换,这应该是一个无限循环。我相信他们已经考虑过这样一种情况,即模式的长度可以分别为0。在这种情况下,replaceall将导致无限循环,因此只有第一个ocurance(字符串的开头)是replacedIt!我对此感到困惑,但我找不到它!你想知道什么?你希望程序进入无限循环并消耗你机器的所有内存吗?不,我不确定我的假设,所以我需要你的帮助来确保它!但根据这本书,如果我使用正则表达式“x”,它也会导致一个无限循环,但会导致“!A.BCDEc!”。那本书是包含Java代码片段,还是只包含正则表达式?但是根据这本书,perl中的“\\G”在Java中有相同的含义!我认为这不是正则表达式语法的问题,而是应用表达式的方法之一。Perl replace可能会自动增加开始索引或其他内容。。。您尝试过Perl代码段吗?我不熟悉Perl,但Perl中“\\G”正则表达式的结果是“!abcdec',与Java相同。我搜索了一点,找到了正确的术语:零长度匹配,]相关,但没有\G:,和@Bergi谢谢,但正如你所说,它们不包含'\\G'。再次感谢你。