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



我似乎不能弄清楚正则表达式量词。像查找"…"这样简单的方法对我不起作用。

这是我的模式:

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

我理解错了吗?表达式"X{n}"的意思是,取X正好n次?

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

我假设由于.......也返回true,那么您正在使用Matcher类中的find方法。现在我可以看到至少有两件事是您想要实现的:

  1. 你想检查整个字符串是否只有...
  2. 你想检查字符串是否包含...,但只有当它恰好是3个点,所以你不想接受...,如果它之前或之后有一些额外的点。

要解决第一种情况,您只需使用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方法。

Matcher m = p.matcher("some... words. with dots.. after..... them...");
while(m.find())
    System.out.println(m.group()+" found at position "+m.start());

将打印

... found at position 4
... found at position 42

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

要从字符串的开头到结尾精确匹配一个模式,需要使用方法matches

或者您可以使用锚来开始^和结束$的字符串:

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

matches不需要锚。

如果您需要使用find方法在更大的字符串中精确地找到...,则需要使用向后看和向前看断言来确保前后没有点:

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

相关内容

  • 没有找到相关文章

最新更新