0

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

这是我的模式:

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

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

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

4

2 回答 2

2

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

  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
于 2014-06-09T12:57:11.410 回答
1

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

要从字符串的开头到结尾完全匹配一个模式,您需要该方法matches

或者您可以使用锚点作为字符串的开始^和结束$

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

不需要锚点matches

如果您需要...使用该方法准确地在较大的字符串中查找find,则需要使用后向和前瞻断言来确保前后没有点:

(?<!\\.)\\.{3}(?!\\.)    # not preceded by a dot, not followed by a dot
于 2014-06-09T12:41:13.310 回答