Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 编程错误导致无法解释的正则表达式_Java_Regex - Fatal编程技术网

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
部分为零宽度)。