System.out.println("du hast mich".replaceAll("(?<=^(.*)) ", ", $1 "));
// prints "du, du hast, du hast mich"
^
看看后面的符号是什么意思?(我知道这个符号的标准平均值是行首)以及为什么点符号匹配到 du 然后 du hast 然后 du hast mich。简而言之,为什么点符号与整个字符串不匹配?
请给我一个解释这个正则表达式是如何正常工作的。我想知道。谢谢你的兴趣。
(?<= )
是lookbehind的语法。这^
只是“字符串的开始”锚点。基本上正则表达式所说的是:
“匹配一个以字符串开头和任意数量的字符开头的空格。空格前面的字符是第一个捕获的组。”
肯德尔有解释。这是一步一步的。
du hast mich
^ regex hasn't matched anything so no replacement
写
du
下一个
du hast mich
^ regex matches
用逗号和空格前的所有内容替换匹配项
, du
下一个
du hast mich
^ no match
写
hast
下一个
du hast mich
^ regex matches
用逗号和空格前的所有内容替换匹配项
, du hast
下一个
du hast mich
^ no match
保持原样
mich
结合所有这些,你会得到
du, du hast, du hast mich
那个正则表达式根本不应该工作。它应该做的是由于后视中的开放式量词而引发异常(.*)
。您似乎发现了一个可以让您绕过该规则的故障。但不要使用它!这绝对是一个错误,而不是一个功能。
Java 的lookbehinds 总是有点棘手,我将其归因于它对lookbehind 子表达式的已知最大长度要求复杂。我开始觉得这个功能是个错误。它只是不足以证明它带来的麻烦是合理的。这就是为什么我尽量避免在我的lookbehinds 中使用任何量词。