0

汎用のテキスト処理ツールであるTexyを移植したいと思います。、PHPからJavaへ。

このツールは、 を使用して、どこでも貪欲でないマッチングを行いpreg_match_all("/.../U")ます。だから私はいくつかのUNGREEDYフラグを持つライブラリを探しています。

構文を使用できることはわかっ.*?ていますが、実際には多くの正規表現を上書きして、更新されたバージョンごとに確認する必要があります。

確認しました

  • ORO - 放棄されたようです
  • ジャカルタ正規表現 - サポートなし
  • java.util.regex - サポートなし

そのようなライブラリはありますか?

ありがとう、オンドラ

4

4 に答える 4

4

更新:ドキュメントを確認した後、LAZY フラグを見つけました。これは貪欲でないことを表す別の用語です。ただし、OpenJDKでのみ利用できるようです

p = Pattern.compile("your regex here", LAZY);
p.matcher("string to match")

元の廃止された応答 正直なところ、存在しないと思います。

+の全体のポイント?と *?貪欲に行うセクションと怠惰に行うセクションを選択できるようにするためです。

貪欲は、正規表現で + と * を最も一般的に使用するため、デフォルトの動作です。実際、それを逆に行う単一の正規表現パーサーは考えられません。修飾子を使用して貪欲なものを作成する場合と同様に、デフォルトは遅延マッチングです。

これがあなたが探している答えではないことはわかっていますが、それを機能させることができる唯一の方法は、? を追加することです。あなたの*と+に。利点として、正規表現を使用して、変更が必要なものを判断することができます。または、すべてを変更する必要がある場合は、変更を加えることもできます。または、変更が必要なものを特定するパターンを説明できる場合。

于 2009-10-12T02:08:03.657 に答える
1

独自の変更されたJavaライブラリを作成することをお勧めします。java.util.regexソースを独自のパッケージにコピーするだけです。

Sun JDK 1.6 Pattern.javaクラスは、次のデフォルトフラグを提供します。

static final int GREEDY     = 0;

static final int LAZY       = 1;

static final int POSSESSIVE = 2;

これらのフラグは数回しか使用されないことに気付くでしょう。変更するのは簡単です。次の例を見てください。

    case '*':
        ch = next();
        if (ch == '?') {
            next();
            return new Curly(prev, 0, MAX_REPS, LAZY);
        } else if (ch == '+') {
            next();
            return new Curly(prev, 0, MAX_REPS, POSSESSIVE);
        }
        return new Curly(prev, 0, MAX_REPS, GREEDY);

最後の行を変更して、GREEDYフラグの代わりに「LAZY」フラグを使用するだけです。正規表現ライブラリをPHPライブラリのように動作させたいので、これが最善の方法かもしれません。

于 2009-10-12T02:52:45.520 に答える
1

'com.caucho.quercus.lib.regexp.JavaRegexpModule'を使用できる場合があります。 QuercusはPHPのJava実装であり、正規表現ライブラリはPHPの正規表現構文とメソッド名を実装します。

于 2009-10-12T02:58:12.593 に答える
1

すべての正規表現をチェックして再チェックするという考えについて、php ライブラリと Java ライブラリが構文に関して十分に一致していて、とにかくこれを行う必要がないことを確信していますか? 私が最初に行うことは、それらすべてを調べて、いくつかのテスト (入力と出力) を作成し、両方の実装で同じように動作することを確認することです。次に、それらを自動的に実行する方法を考案してください。そうすれば、将来のアップグレードや非互換性に対応できます。まだ微調整する必要がありますが、少なくとも場所はわかります。

于 2009-10-12T02:17:32.997 に答える