【问题标题】:Java - replaceAll by regex, then replace first occurance of stringJava - 用正则表达式替换所有,然后替换第一次出现的字符串
【发布时间】:2011-11-11 12:18:26
【问题描述】:

我有这个带有 HTML 的字符串:<span title="whatever">something I want to preserve</span>...

我正在使用正则表达式将<span title="whatever"> 替换为(,然后将以下</span> 替换为)

Pattern regex = Pattern.compile("<span\\s+[^>]*title=(['\"])(.*?)\\1[^>]*>");
Matcher matcher = regex.matcher(strLine);
if (matcher.find()) {
    strLine = matcher.replaceAll("(");
    strLine = strLine.replace("</span>", ")");
}

我可以工作,但它替换了所有&lt;/span&gt; 标签;我只想替换与我刚刚匹配的开始标签匹配的那个。

【问题讨论】:

  • 你试过replace而不是replaceAll吗?
  • 所以如果我理解正确的话,你需要用 () 替换任何带有标题的跨度,但是任何没有标题的跨度你都不想理会。你上面的问题是开始标签&lt;span&gt;被正确替换了,但是太多的结束标签&lt;/span&gt;被替换了(即那些匹配没有标题的开始标签。这是正确的吗?跨度>

标签: java regex replace


【解决方案1】:

为什么不在一个replaceAll(...) 电话中完成:

String s = "noise <span title=\"whatever\">something I want to preserve</span>...";
s = s.replaceAll("<span\\s+[^>]*title=(['\"])(.*?)\\1[^>]*>(.*?)</span>", "($3)");
System.out.println(s);

将打印:

noise (something I want to preserve)...

编辑

请注意 Alan 在我的回答下的评论:这假设您的输入中没有嵌套 &lt;span&gt;

【讨论】:

  • 这假设不会有任何其他 &lt;span&gt; 元素嵌套在您要匹​​配的元素中。
【解决方案2】:

我建议您使用单个正则表达式来匹配整个 &lt;span ...&gt;...&lt;/span&gt;。捕获一组中的&lt;span&gt; 和另一组中的&lt;/span&gt;,并使用捕获组进行替换。

【讨论】:

    【解决方案3】:

    您可以尝试提取&lt;span&gt; 标记的内容,然后用大括号将其包裹起来,而不是替换&lt;span&gt; 标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2021-04-29
      • 2019-09-25
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2021-07-25
      相关资源
      最近更新 更多