4
System.out.println("du hast mich".replaceAll("(?<=^(.*)) ", ", $1 "));
// prints "du, du hast, du hast mich"

^看看后面的符号是什么意思?(我知道这个符号的标准平均值是行首)以及为什么点符号匹配到 du 然后 du hast 然后 du hast mich。简而言之,为什么点符号与整个字符串不匹配?

请给我一个解释这个正则表达式是如何正常工作的。我想知道。谢谢你的兴趣。

4

3 回答 3

3

(?<= )lookbehind的语法。这^只是“字符串的开始”锚点。基本上正则表达式所说的是:

“匹配一个以字符串开头和任意数量的字符开头的空格。空格前面的字符是第一个捕获的组。”

于 2013-10-24T14:19:21.130 回答
2

肯德尔有解释。这是一步一步的。

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
于 2013-10-24T14:30:54.100 回答
0

那个正则表达式根本不应该工作。它应该做的是由于后视中的开放式量词而引发异常(.*)。您似乎发现了一个可以让您绕过该规则的故障。但不要使用它!这绝对是一个错误,而不是一个功能。

Java 的lookbehinds 总是有点棘手,我将其归因于它对lookbehind 子表达式的已知最大长度要求复杂。我开始觉得这个功能是个错误。它只是不足以证明它带来的麻烦是合理的。这就是为什么我尽量避免在我的lookbehinds 中使用任何量词。

于 2013-10-24T16:08:46.410 回答