【问题标题】:replace substring using regex使用正则表达式替换子字符串
【发布时间】:2012-07-11 22:29:15
【问题描述】:

我有一个包含许多 <xxx> 值的字符串。

我想检索<> 中的值,进行一些操作并将新值重新插入到字符串中。

我做的是

input = This is <abc_d> a sample <ea1_j> input <lmk_02> string
while(input.matches(".*<.+[\S][^<]>.*"))
{
   value = input.substring(input.indexOf("<") + 1, input.indexOf(">"));
   //calculate manipulatedValue from value
   input = input.replaceFirst("<.+>", manipulatedValue);
}

但在第一次迭代之后,值包含abc_d&gt; a sample &lt;ea1_j&gt; input &lt;lmk_02。我相信 indexOf(">") 会给出">"的第一个索引。我哪里做错了?

【问题讨论】:

    标签: java regex substring


    【解决方案1】:

    这是完成您正在尝试做的事情的一种稍微简单的方法:

    String input = "This is <abc_d> a sample <ea1_j> input <lmk_02> string";
    Matcher matcher = Pattern.compile("<([^>]*)>").matcher(input);
    StringBuffer sb = new StringBuffer();
    while(matcher.find()) {
        matcher.appendReplacement(sb, manipulateValue(matcher.group(1)));
    }
    matcher.appendTail(sb);
    System.out.println(sb.toString());
    

    【讨论】:

    • StringBuilder 将是在这里使用的更好选择,但否则您的解决方案看起来不错,赞成。
    • @MichaelSchmeißer:如果matcher.appendReplacement() 接受StringBuilder 作为参数,我会使用它。
    • 哦,我明白了。我没有意识到这一点(我认为这也有点奇怪),所以我猜你的答案没有什么可以改进的。 :)
    • @MichaelSchmeißer:是的,这有点奇怪,这似乎是使用StringBuilder 的理想场所,但我猜他们不想扩展Matcher API。
    • 根据我的回答,您可能需要在替换字符串上使用 Matcher.quoteReplacement - appendReplacement 允许像 $1 这样的反向引用将匹配中的组包含在替换中(例如 @ 的模式987654329@ 和 =$1= 的替换字符串会将 &lt;foo&gt; 更改为 =foo=)。如果您想在替换字符串中使用文字$,则必须将其转义为\$,因此如果您想要文字反斜杠必须加倍。 quoteReplacement 方法会为您完成这些替换。
    【解决方案2】:

    这是appendReplacementappendTail 成语的一个很好的用例:

    Pattern p = Pattern.compile("<([^>]+)>");
    Matcher m = p.matcher(input);
    StringBuffer out = new StringBuffer():
    while(m.find()) {
      String value = m.group(1);
      // calculate manipulatedValue
      m.appendReplacement(out, Matcher.quoteReplacement(manipulatedValue));
    }
    m.appendTail(out);
    

    【讨论】:

      【解决方案3】:

      尝试在正则表达式中使用转义字符 \\

      【讨论】:

      • 转义字符应该在什么时候帮助正则表达式?此外,您应该提到转义字符必须成对出现在 Java 正则表达式中。
      猜你喜欢
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      相关资源
      最近更新 更多