正規表現(グループ)で文字列パラメーターのリストを使用して新しい文字列を作成する方法はありますか?
-
06-07-2019 - |
質問
たとえば、次のような正規表現があるとします:
"The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)."
この正規表現には3つのグループ化されたコンポーネントがあります-特定の文字列と一致する場合、正規表現APIを使用すると、各グループ内の値を簡単に抽出できます。
今、3つの文字列があるとしましょう:
["red", "leaps","cat"]
グループ内にない正規表現のすべての文字が単なるリテラルテキスト文字であると仮定した場合- 元の正規表現の対応するグループにこれらの3つの文字列をそれぞれ挿入し、正規表現のグループ化されていない部分を結合した出力文字列を作成する方法はありますか?この場合、「速い猫は怠catな猫を飛び越えます」という結果になります。 できれば、すでに正規表現に一致する文字列を用意する必要はありません。
Javaでこれを行うことを検討しています-java.util.regexはこれをサポートしていないと確信していますが、これを行うことができるサードパーティ製のライブラリがあるかもしれないと考えました。誰かが私にいくつかのポインタを与えることができますか?
解決
ネストされたキャプチャグループなしでできる限り、より多くの正規表現を使用してリテラルを取得できます。
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();
他のヒント
ほとんどの正規表現の実装では、検索と置換で次のようなことができます。
s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/
所属していません StackOverflow