Java 编程错误导致无法解释的正则表达式
对于我错误地创建了以下正则表达式的测试:Java 编程错误导致无法解释的正则表达式,java,regex,Java,Regex,对于我错误地创建了以下正则表达式的测试: |(\\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
|(\\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+
。你可以在第一个|
的右边写下任何(有效的)模式,它永远不会被访问
引擎的工作方式如下:它在主题字符串中有一个当前位置光标。它尝试从当前位置开始匹配。因为您的正则表达式是匹配的,所以它将在此时执行替换,然后在找到匹配项后移动当前位置光标
但由于匹配的宽度为零,它只会前进到下一个字符,因为不这样做会导致无限循环。因为第一个匹配的备选方案获胜。因此,第二个分支永远不会被测试。如果对于正则表达式
foo | bar
foo
部分将被匹配,那么正则表达式引擎甚至不会检查bar
部分并移动到下一个位置(即使匹配的foo
部分为零宽度)。