gpt4 book ai didi

java - 编程错误导致无法解释的正则表达式

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:53:06 26 4
gpt4 key购买 nike

对于我错误地创建了以下正则表达式的测试:

|(\\w+)|

我很困惑这个正则表达式真的有效,我无法解释结果:

 public static void main(String[] args) {
String toReplace="Hey I'm a lovely String an I'm giving my |value| worth!";
// String replacement1="2 cent"; // I planned to replace |value| with 2 cent
String replacement1="@"; // to produce a better Output
String regex="|(\\w+)|"; // I forgot to escape the |
replacement1="@";
result=toReplace.replaceAll(regex,replacement1);
System.out.println(result);
}

结果是:

@H@e@y@ @I@'@m@ @a@ @l@o@v@e@l@y@ @S@t@r@i@n@g@ @a@n@ @I@'@m@ @g@i@v@i@n@g@ @m@y@ @|@v@a@l@u@e@|@ @w@o@r@t@h@!@

到目前为止,我的想法是 java 尝试替换字符之间的“无”,但为什么不替换字符本身呢?

\\w+ 应该匹配 'H'

我希望每个字符都被 3 个 @ 符号替换或仅被一个替换,但字符没有被替换让我感到困惑。

最佳答案

你是对的,这个正则表达式匹配每个字符之间的空字符串。

由于第一个选择(| 左边的空字符串)匹配,模式的其余部分甚至都没有尝试过,所以 \w+ 甚至没有由匹配引擎到达。您可以在第一个 | 的右侧写入任何(有效)模式,它永远不会到达。

引擎的工作方式如下:它在主题字符串中有一个当前位置光标。它尝试从当前位置开始匹配。由于您的正则表达式是一个匹配项,它将在此时执行替换,然后将当前位置光标移动到找到的匹配项之后

但是由于匹配是零宽度的,它只是前进到下一个字符,因为不这样做会导致无限循环。

关于java - 编程错误导致无法解释的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30052974/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com