2012-05-11 19 views
4

Javaの正規表現を逆にするには?たとえば、 'ab。+ de' => 'ed。+ ba'などです。Javaの逆正規表現

+0

なぜこれを行う必要がありますか? –

+2

バックワード検索を実装するには、これを行う必要があります。 – Michael

答えて

4

wow。

正規表現用のパーサーを作成し、すべてのトークン/パーツを逆にする必要があります。

この場合

AB +デ

、B、である。+、D、E

これは

E、D、+、bは逆、

今グループ

((AB)(。+デ))

を想像

((編+)(BA))

+1

+1再帰関数のように思えます。再帰的にサブグループを逆順にしてから、スタックをバックアップする方法でサブグループを(逆順に)連結してください。 – Paulpro

+0

(?<= expression)のような特別な正規表現は目立たないので注意が必要です。しかし、Javaでは...うーん...おそらくそれは仕事ではない –

+0

ええ、私は通常の言語のための本当の正規表現のためにこれを実装します。これは、基本的にちょうど連結( '.abc')、交替' .a | b | c'、有限カウント( '。{2} a + b?c {、3}')です。 – Paulpro

4

針よりも乾草を逆転させるほうがはるかに簡単です。 MatcherStringの代わりにCharSequenceを受け取るので、String(単にReverse a string in Java, in O(1)?の回答を参照)をラップするだけで簡単にオーバーヘッドできます。

Matcherの代替バージョンを作成してパターンを反転しているように見せてもかまいませんが、入力を逆転させるだけです。

0

Tiago Peczenyjが正しいと背面の両方の参照であり、捕捉基と命名基が扱われる必要があります。名前付きグループは、名前付きグループを名前で参照する必要があるというJava RegExの制限がないため、他の任意のグループと同様に番号で参照することができます。

誰かがJavaソリューションに関心があるならば、私はそれを行うためのライブラリを実装しました。 https://github.com/vsch/reverse-regex

すべての有効なJava正規表現構文を処理し、すべてのニーズマッピングと逆転を処理する逆引き検索用のパターン、マッチャ、および入力をラップするユーティリティクラスを提供します。