正则表达式量词不按预期工作

时间:2014-06-09 12:36:42

标签: java regex quantifiers

我似乎无法弄清楚正则表达量词。像寻找“......”这样简单的东西对我来说不起作用。

这是我的模式:

Pattern p = Pattern.compile("\\.{3}");

我理解错了吗?表达式“X {n}”表示将X精确地取n次?

但像“......”这样的字符串工作得很好,即使它不是3次。

2 个答案:

答案 0 :(得分:2)

我认为由于...的{​​{1}}也返回true,因此您正在使用Matcher类中的....方法。现在我至少可以看到你想要实现的两件事:

  1. 您想检查整个字符串是否仅为find
  2. 您想检查字符串是否包含...,但前提是它只有3个点,所以如果它之前或之后有一些额外的点,则不希望接受...
  3. 要解决案例1,您只需使用{/ 1}}方法,例如

    ...

    要解决第二种情况,您需要使用negative-look-around机制明确说明matches之前或之后不应有任何点,以便您的正则表达式看起来像

    Pattern p = Pattern.compile("\\.{3}");
    Matcher m = p.matcher("...");
    System.out.println(m.matches());//returns true
    m = p.matcher("....");
    System.out.println(m.matches());//returns false
    

    现在你可以像以前那样使用...方法。

    Pattern p = Pattern.compile("(?<!\\.)\\.{3}(?!\\.)");
    

    将打印

    find

答案 1 :(得分:1)

这取决于您使用的方法,如果您使用find方法或lookingAt,因为\\.{3}....您将获得匹配,因为这三个找到了点。

要准确匹配从字符串的开头到结尾的模式,您需要方法matches

或者你可以使用锚点开始^和结束$字符串:

with lookingAt: \\.{3}$
with find:      ^\\.{3}$

matches不需要锚点。

如果您需要使用...方法在更大的字符串中找到find,则需要使用lookbehind和lookahead断言以确保之前和之后没有点:

(?<!\\.)\\.{3}(?!\\.)    # not preceded by a dot, not followed by a dot