2015-08-08 56 views
1
public class Test { 
    public static void main(String[] args){ 
     Pattern a = Pattern.compile("(?=\\.)|(?<=\\.)"); 
     Matcher b = a.matcher("."); 
     while (b.find()) System.out.print("+"); 
    } 
} 

我一直在阅读上Regular-Expressions.info环视部分,并试图弄清楚它是如何工作的,我坚持用这个东西环视工作。当我运行上面的代码的结果是++,我不明白,因为“。”是与这种模式相对应的唯一标志,显然在“”后面或前面没有任何东西。那么它如何匹配两次呢?如何正则单独使用时

+0

@hwnd我的理解lookarounds并不消耗任何标记,但我不明白的是,没有任何标记在“。”之后或之前,因为我只有lookbehead和lookahead而不是\ \。在我编译的模式中,我认为它不应该匹配任何东西,但不知何故它会匹配两次。 – tareviverat

+0

'^^^'由于[zero-width](https://regex101.com/r/rI5bH1/2)的位置,你得到两个匹配。 – hwnd

+0

@hwnd对不起,不停地打扰你......不是零宽度意味着它是一个断言(应该有一段时间要么在前面,要么在当前位置后面),它不会消耗任何令牌(http:// stackoverflow.com/questions/3275375/zero-width-token)我不明白你的意思是零宽度的位置......你的意思是像“。”之前和之后的空白。 ? – tareviverat

回答

1

作为正则表达式引擎前进通过所述输入,则认为这两个字符位置输入内之前和之后字符作为不同的位置。

您输入有3个位置:

  1. 只是第一个字符
  2. 第一个字符
  3. 只是第一个字符

位置1场比赛(?=\\.)前后。
位置3匹配(?<=\\.)

+0

现在我明白了。非常感谢! – tareviverat