4

送信された正規表現を使用し、それを使用して文字列から値を取得するサービスを実行しています。

クラス内にメイン メソッドを作成し、正規表現をデバッグする(?<=\\().+?(?=\\){1})と、完全に機能します。

ただし、リモートでテストするために tomcat にデプロイするとすぐに、次の例外が発生します。

Look-behind group does not have an obvious maximum length near index 19
(?<=\\().+?(?=\\){1})
                   ^

呼び出されている値を解析する関数は次のとおりです。

private String parsePattern(String value, String pattern)
{
    String ret = "";

    Matcher m = Pattern.compile(pattern).matcher(value);
    while (m.find())
    {
        ret = m.group(0);
    }

    return ret;
}

アプリでコンパイルするのに、webapp で動作しない原因は何ですか?

編集:

これはどの文字列でも失敗しますが、現在チェックされている文字列は "(Group Camp Renovation)" です。

から呼び出されるとmain、このメソッドは「Group Camp Renovation」を返します。webapp 経由で呼び出されると、例外がスローされます。

4

2 に答える 2

6

問題は - 繰り返しますが - Java コード内の文字列の引用と、ある種の入力を介して読み取られたときの引用なしです。

次のように文字列を貼り付けると(?<=\\().+?(?=\\){1}):

String s1 = "(?<=\\().+?(?=\\){1})";
System.out.println(s1);

この出力が得られます

(?<=\().+?(?=\){1})

これが正規表現パーサーが見るものです。

しかし、同じ文字列がInputStream(単なる例として) を介して読み取られる場合、何も変更されません。

String s1 = new BufferedReader(new InputStreamReader(System.in)).readLine();
System.out.println(s1);

印刷します

(?<=\\().+?(?=\\){1})

つまり、はパーツではなくパーツに{1}起因するということです。(?=\\)(?<=

于 2013-05-31T11:04:20.760 に答える
0

あなたのパターンをideoneに入力しました。結果は Tomcat の結果と同じです。

System.out.println("aoeu".matches("(?<=\\\\().+?(?=\\\\){1})"));

エラーメッセージにある文字列を受け取るために、文字列リテラルのすべてのバックスラッシュを2倍にしたことに注意してください。Pattern.compile

于 2013-05-31T10:55:24.427 に答える