1

たとえば、次のような正規表現があるとします。

"The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)."

この正規表現には3つのグループ化されたコンポーネントがあります。特定の文字列と一致する場合、正規表現APIを使用すると、各グループ内の値を簡単に抽出できます。

ここで、3つの文字列があるとします。

["red", "leaps","cat"]

グループ内にない正規表現内のすべての文字が単なるリテラルテキスト文字であると仮定すると、これらの3つの文字列のそれぞれを、元の正規表現の対応するグループに挿入して、次のような出力文字列を作成する方法があります。正規表現のグループ化されていない部分を組み合わせますか?この場合、「速い赤狐は怠惰な猫を飛び越えます」という結果になります。できれば、正規表現にすでに一致している文字列を用意する必要はありません。

私はJavaでこれを実行しようとしています-java.util.regexはこれをサポートしていないと確信していますが、これを実行できるサードパーティのlibが存在する可能性があると思いました。誰かが私にいくつかのポインタを与えることができますか?

4

2 に答える 2

1

ほとんどの正規表現の実装では、検索と置換で次のようなことを行うことができます。

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
于 2009-11-28T23:02:48.257 に答える
1

ネストされたキャプチャグループなしで実行できる限り、より多くの正規表現を使用してリテラルを取得できます。

String[] strings = new String[] { "red", "leaps", "dog" };
String[] literals = new String("The quick (red|brown|blue|yellow) fox " +
    "(jumps|leaps) over the lazy (dog|cat).").split("(?=[^\\\\])\\(.*?\\)");

StringBuilder sb = new StringBuilder(literals[0]);
for(int i = 0; i < strings.length; i++) {
    sb.append(strings[i]);
    sb.append(literals[i + 1]);
}

// => sb.toString();
于 2009-11-28T23:32:44.030 に答える