2013-04-16 20 views
10

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

String s = "Page 3 of 23" 

私は同様の文字列(例えば"Page 7 of 47")を一致させるためにこれを使用することができ\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"); 

によってすべての数字を代入した場合。私の問題は、私がこれを行うと、(){}-などのメタキャラクタの一部がエスケープされないということです。これを行うためのライブラリか、正規表現のための文字の網羅的なセットがありますか?私はそれを避けてはいけませんか? (私はJavadocsから抽出しようとすることができますが、何かが見つからないことを心配しています)。

また、既にこれを行うライブラリがあります(この段階では完全なNatural Language Processingソリューションを使用しません)。

注:@ dasblinkenlightの編集された回答は、現在私にとって役立ちます!そのすべてのメタ文字を持っています「引用符で囲まれた」文字列はエスケープ

String s = Pattern.quote(orig); 

+0

ここではどの文字の質問に答えるが、私は正規表現を生成するライブラリは認識していない:http://stackoverflow.com/questions/399078/what-special-characters-must-be-escaped-in -regular-expressions –

+0

@エヴァンありがとう。私はJavaに興味があるので、役に立つリソースのように見えます。 –

答えて

10

Javaの正規表現ライブラリは、この機能を提供します。まず、文字列をエスケープしてから、それを通り、数字を\dに置き換えて正規表現を作成します。正規表現ライブラリは\Q\Eを引用用に使用するため、正規表現の一部を逆引用符で囲んで\E\Qとする必要があります。

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

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

このproduce"\QPage \E\d+\Q of \E\d+\Q\E"どんなページ番号とカウントはもともとなかったでしょう。 \dに出力は1つだけで、2つのスラッシュではありません。結果はJavaコンパイラをバイパスして正規表現エンジンに直接送られるためです。

+0

クール、私はこの方法について知りませんでした。 – toniedzwiedz

+0

@dasblinkenlight素晴らしい!合意私は繰り返し数字を探すかもし​​れませんが、正確な数字があるという私の発見的価値もあります。私は両方のアプローチを使用するかもしれません。 –

+0

@ peter.murray.rust最後の編集を参照してください。出力に2つのスラッシュを付けるために必要なスラッシュの数は、実際にはばかげています。コンパイラでは2倍、正規表現ライブラリでは2倍です。 – dasblinkenlight