这个正则表达式如何工作?

时间:2013-10-24 14:11:37

标签: java regex

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

后面看后^符号的意思是什么? (我知道这个符号的标准均值是该行的起点)为什么点符号与du匹配,然后du hast mhis.in briesf为什么点符号与整个字符串不匹配?

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

正则表达式根本不起作用。它应该做的是抛出一个异常,因为在后面是开放式量词(.*)。您似乎发现了一个可以绕过该规则的故障。但是不要用它!这肯定是一个错误,而不是一个功能。

Java的lookbehinds总是有点抽搐,我将其归因于对于lookbehind子表达式的复杂的已知最大长度要求。我觉得这个特征是个错误;它足以证明它带来的麻烦是没有用的。这就是为什么我试图避免在我的外观中使用任何量词。