10

数字を含む文字列から正規表現を生成し、これをパターンとして使用して類似の文字列を検索したいと考えています。例:

String s = "Page 3 of 23"

すべての数字を\d

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    if (Character.isDigit(c)) {
        sb.append("\\d"); // backslash d
    } else {
        sb.append(c);
        }
    }

    Pattern numberPattern = Pattern.compile(sb.toString());

//    Pattern numberPattern = Pattern.compile("Page \d of \d\d");

これを使用して、同様の文字列に一致させることができます (例: "Page 7 of 47")。私の問題は、これを単純に行うと(){}-、などのメタ文字の一部がエスケープされないことです。これを行うためのライブラリ、またはエスケープしなければならない、またはエスケープしてはならない正規表現用の文字の完全なセットはありますか? ( Javadocsからそれらを抽出しようとすることはできますが、何かが欠けているのではないかと心配しています)。

あるいは、すでにこれを行っているライブラリがあります (この段階では、完全な自然言語処理ソリューションを使用したくありません)。

注:@dasblinkenlightの編集された回答が機能するようになりました!

4

1 に答える 1

10

Java の正規表現ライブラリは、次の機能を提供します。

String s = Pattern.quote(orig);

「引用された」文字列では、すべてのメタ文字がエスケープされます。まず、文字列をエスケープしてから、文字列を調べて数字を に置き換え\dて正規表現を作成します。正規表現ライブラリは引用に\Qandを使用するため、正規表現の一部をand\Eの逆引用符で囲む必要があります。\E\Q

あなたの実装で変更することの 1 つは、置換アルゴリズムです。文字ごとに置換するのではなく、数字をグループで置換します。これにより、andPage 3 of 23のような一致文字列から式が生成されます。Page 13 of 23Page 6 of 8

String p = Pattern.quote(orig).replaceAll("\\d+", "\\\\E\\\\d+\\\\Q");

これにより、元のページ番号とカウントに関係なく生成されます。 結果は Java コンパイラをバイパスして正規表現エンジンに直接送られるため、"\QPage \E\d+\Q of \E\d+\Q\E"出力に必要なスラッシュは 2 つではなく 1 つだけです。\d

于 2013-04-16T10:18:53.663 に答える