【问题标题】:Is there a way to use a list of string parameters with a regular expression (with groups) to construct a new string?有没有办法使用带有正则表达式(带组)的字符串参数列表来构造新字符串?
【发布时间】:2010-12-21 07:19:51
【问题描述】:

假设我有一个像这样的正则表达式:

"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 不支持此操作,但我认为可能会有一个 3rd 方库可以允许执行此操作。谁能指点一下?

【问题讨论】:

  • 为什么不使用模板库?你有什么目的?
  • 正则表达式字符串是否一致?或者是否允许使用"The quick %s fox %s over the lazy %s." 之类的东西?
  • 我希望为 url 映射做一些类似于 django 的 reverse() 的事情。 Django 允许您将正则表达式映射到可调用对象,并且当您使用 reverse() 时,这些组将成为可调用对象的参数。示例:/user/(\d+)/ 映射到 home(user_id),因此 reverse(home, 12) 返回“/user/12/”(基本上,返回将映射到它的 URL)。现在我已经将代码挖掘到 django,看起来他们正在使用一段相当复杂(而且很有趣!)的代码,它手动解析正则表达式以生成一个对象,该对象可以从 arg 列表生成反向 URL 映射。我可能只是用 java 重新实现。

标签: java regex regex-group


【解决方案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();

【讨论】:

  • 对于更长的字符串,您可能希望使用编译后的 PatternMatcher 而不是 split
【解决方案2】:

大多数正则表达式实现允许您在搜索和替换中执行类似的操作:

s/The quick (red|brown|blue|yellow) fox (jumps|leaps) over the lazy (dog|cat)/The quick $1 fox $2 over the lazy $3/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-21
    • 2017-02-15
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2023-03-30
    相关资源
    最近更新 更多