有没有办法使用带有正则表达式(带组)的字符串参数列表来构造新字符串?

时间:2009-11-28 22:52:45

标签: java regex regex-group

比方说,我有一个像这样的正则表达式:

"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可以允许这样做。谁能给我一些指示?

2 个答案:

答案 0 :(得分: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/

答案 1 :(得分: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();