0

I can't seem to figure out regular expression quantifiers. Something as simple as look for "..." does not work for me.

This is my pattern:

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

Am I understanding something wrong? The expression "X{n}" means, take X exactly n times?

But Strings like "...." work just fine, even though it isn't exactly 3 times.

4

2 に答える 2

2

...戻り値もtrueなので、Matcherクラスのメソッドを....使用していると思います。findこれで、達成したいことが少なくとも 2 つあります。

  1. 文字列全体が...
  2. 文字列に含まれているかどうかを確認したいが、それが正確に 3 つのドットである場合にのみ、その前後に追加のドットがあるかどうか...を受け入れたくありません。...

matchesケース1を解決するには、次のようなメソッドを使用するだけです

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

2番目のケースを解決するには、ネガティブルックアラウンド...メカニズムを使用して、正規表現が次のようになるように、前後にドットがあってはならないことを明示的に示す必要があります

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}内部....に があるため、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 に答える