1

OR (つまり | ) で区切られた Java 正規表現パターンのセットが与えられた場合、パターンが従う特定の優先順位はありますか。

コード例:-

    List<String> columnValues = new ArrayList<String>

    String []columnPatterns = new String[] { "(\\S\\s?)+", "(\\S\\s?)+",
                "(\\d+,?)+\\.\\d+ | \\d+:\\d+", "(\\S\\s?)+",
                "-?\\$?(\\d+,?)+\\.\\d+" };

    String searchString = "Text1            This is Text 2                                          129.80";

    int findFrom = 0;
    int columnIndex = 0;
    List<String> columnValues = new ArrayList<String>();
    for (String pattern : columnPatterns) {
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(searchString);
        if (m.find(findFrom)) {
            columnValues.add(columnIndex++,
                    searchString.substring(m.start(), m.end()).trim());
            findFrom = m.end();
        }
    }

    for (String value : columnValues) {
        System.out.println("<" + value + ">");
    }

上記のコードは次の結果をもたらします:-

    <Text1>
    <This is Text 2>
    <129.80>

しかし、columnPatterns 配列のインデックス位置 2 のパターンを "(\d+,?)+\.\d+ | \d+:\d+" から "(\d+,?)+\.\d+ | \d+" に変更すると、 :\d+ | \d+" 以下に示すように:-

    columnPatterns = new String[] { "(\\S\\s?)+", "(\\S\\s?)+",
                "(\\d+,?)+\\.\\d+ | \\d+:\\d+ | \\d+", "(\\S\\s?)+",
                "-?\\$?(\\d+,?)+\\.\\d+" };

次の結果が得られます:-

   <Text1>
   <This is Text 2>
   <129>
   <.80>

これは、何らかの暗黙の優先順位が適用されていることを意味していますか、それともこの背後に他の理由があり、この動作の解決策/回避策は何ですか?

編集:また、なぜコードがそのように動作するのですか。

4

1 に答える 1

3

OR (つまり | ) で区切られた Java 正規表現パターンのセットが与えられた場合、パターンが従う特定の優先順位はありますか?

左から右へ。文字列の各位置で、各交互が順番にテストされ、最初に一致したものが最終一致になります (後でバックトラックされない限り)。

あなたの場合、最初にスペースがあるため、最後の交代が最初に一致します。したがって、前の交代が一致しない場合に一致する可能性があります。

たとえば\d| \d、string のパターンに一致するfoo 7場合、2 番目の代替は、文字列のインデックス 3 で最初に一致します。最初のものはその位置で一致できず、インデックス 4 でのみ一致できます。

于 2012-04-05T15:40:57.610 に答える