替换匹配regexp的文本的子字符串

时间:2017-11-16 14:58:47

标签: java regex

我的文字看起来像这样:

1. Must have experience in Java 2. Team leader...

我想在HTML中将其呈现为有序列表。现在将</li>标记添加到最后很简单:

s = replace(s, ". ", "</li>");

但是如何用1.替换2.<li>等?

我有正则表达式\d*\.$,它匹配带句点的数字,但问题是这是一个子字符串,因此匹配1. Must have experience in Java 2. Team leader\d*\.$会返回false

3 个答案:

答案 0 :(得分:3)

代码

See regex in use here

\d+\.\s+(.*?)\s*(?=\d+\.\s+|$)

替换

<li>$1</li>\n

结果

输入

  
      
  1. 必须具备Java 2的团队经验......
  2.   

输出

<li>Must have experience in Java</li>
<li>Team leader...</li>

说明

  • \d+匹配一个或多个数字
  • \.字面匹配点字符.
  • \s+匹配一个或多个空白字符
  • (.*?)任意次数捕获任何字符,但尽可能少捕获到捕获组1
  • \s*匹配任意数量的空白字符
  • (?=\d+\.\s+|$)肯定前瞻,确保以下任何一项都不匹配
    1. \d+\.\s+
      • \d+匹配一个或多个数字
      • \.字面匹配点字符.
      • \s+匹配一个或多个空白字符
    2. $断言行尾的位置

答案 1 :(得分:2)

  

但如何用1.替换2.<li>等?

您可以使用String#replaceAll来支持正则表达式而不是替换:

s = s.replaceAll("\\d+\\.\\s", "</li>");

注意

  • 您不需要在正则表达式的末尾使用$
  • 您必须转义点.,因为它表示正则表达式中的任何字符
  • 您可以将\s用于一个空格,或\s*用于零个或多个空格,或者\ s +用于一个或多个空格

答案 2 :(得分:0)

我们想要

s = s.replaceAll("(?s)(\\d+\\.)\\s+(.*\\.)\\s*", "<li>$2</li></ol>");
s = s.replaceFirst("<li>", "<ol><li>");
s = s.replaceAll("(?s)</li></ol><li>", "</li>\n<li>");

这可以这样做:

</li></ol>

诀窍是首先添加</ol>一个假的(?s),它应该只保留在最后一个列表项之后。

.是DOTALL表示法,导致<h3 id="change">to change</h3> <input id="age" type="number"/> <button onclick="change()">change</button> <script> function change() { var age = document.getElementById("age").value; //make a computation parseInt(age) + 1 document.getElementById("change").innerHTML = "hello" + age } </script>也匹配换行符。

如果有多个编号列表,则不会这样做。此外,它假设每个列表项只有一个句子。