1

Java 1.8.0_241 で正規表現が有効かどうかをテストしたい

public static boolean isRegExpValid(String regExp) {
    try {
        Pattern.compile(regExp);
        return true;
    } catch (PatternSyntaxException e) {
        return false;
    }
}

ここでは、3 桁の数値の正しい正規表現と、正しくない正規表現をテストしています。

@Test
public void testValidRegexp() {
    assertTrue(isRegExpValid("\\d{3}"));
}

@Test
public void testInvalidRegexp() {
    assertFalse(isRegExpValid("{3}"));
}

2 番目のテストtestInvalidRegexpが失敗するのはなぜですか? isRegExpValid("{3}")false を返す必要がありますが、true を返します。

Javascript では、 Nothing to repeat例外 で{3}正しく失敗します。ここに画像の説明を入力

4

2 に答える 2

6

空の文字列とうまく一致しているように見えます:

jshell> Pattern.matches("{3}x", "x")
$1 ==> true

ドキュメントはこれを有効な使用法として定義していないようですが、他の小さな構文の問題が検出されてスローされる場所を通過しますPattern.error

実装がこれを受け入れる理由を分析するにはPattern#closure、パターンの解析中に をどこから呼び出すことができるかを把握する必要があります。

于 2020-11-24T10:28:35.667 に答える
1

{3}は Java で有効な正規表現ですが、空の文字列にのみ一致します

コードデモは次のとおりです。

jshell> Matcher m = Pattern.compile("{3}").matcher("A {3} here");
m ==> java.util.regex.Matcher[pattern={3} region=0,10 lastmatch=]

jshell> while (m.find()) { System.out.println( "<" + m.group() + "> | " + m.start() + " | " + m.end()); }

<> | 0 | 0
<> | 1 | 1
<> | 2 | 2
<> | 3 | 3
<> | 4 | 4
<> | 5 | 5
<> | 6 | 6
<> | 7 | 7
<> | 8 | 8
<> | 9 | 9
<> | 10 | 10

貪欲な量Pattern Javadoc指定子を定義しているように:

X{n} X、正確にn

Xこれは単なる空の文字列であるため、空の文字列が正確に 3 回であっても、空の文字列のみであることを意味します。

于 2020-11-24T10:30:34.807 に答える