1

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

  String input = "abcdec";
  System.out.println(String.format("Before :'%s' ; after replace : '%s'", input , input.replaceAll("\\Gx?", "!")));

当它打印Before :'abcdec' ; after replace : '!abcdec'时,我不知道为什么它打印这个,在它第一次与字符串的开头匹配之后,它用一个字符'!'替换了这个地方 ,但为什么不能再次匹配?我认为正则表达式'\ Gx?可以匹配每个地方。

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

4

2 回答 2

0

我从这里引用:If you wish one search to pick up where the last one left off you can use the "\G" pattern element. 这意味着如果没有执行搜索,那么 \G 只是告诉搜索从字符串的开头开始并在第一个匹配时停止。

这是另一个例子。请注意,由于第一次替换没有从 0 开始移动起始位置,所以再次在字符串的请求中添加了一个感叹号。

你对你的计划有什么期待?

于 2012-07-26T07:39:24.207 回答
0

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


会发生什么:

  1. replaceAll从输入的开头开始(索引0
  2. \G匹配初始起始值0
  3. x找不到 - 没关系,这是有条件的
  4. 到了终点。0从到成功的第一场比赛0
  5. 将替换添加!到输出
  6. 下一次迭代,从一个字符开始(索引1
  7. 最后一场比赛的结局是0\G,申请的职位1不匹配
  8. ...遍历整个字符串,它永远不会匹配。
  9. 返回输出字符串:!abc...

当我阅读Regex Boundary Matchers Java Tuturial中的最后一个示例时,我更清楚了。

于 2012-07-26T07:51:09.537 回答