Java 替换文本匹配regexp的子字符串
我有这样的文本:Java 替换文本匹配regexp的子字符串,java,regex,Java,Regex,我有这样的文本: 1. Must have experience in Java 2. Team leader... 我想在HTML中呈现一个有序列表。现在,在末尾添加标记非常简单: s = replace(s, ". ", "</li>"); s=replace(s,“.”,“”; 但是如何用替换1.,2.等呢 我有一个正则表达式\d*\.$,它将一个数字与一个句点相匹配,但问题是这是一个子字符串,所以匹配1。必须有Java 2方面的经验。团队负责人使用\d*\.$返回fal
1. Must have experience in Java 2. Team leader...
我想在HTML中呈现一个有序列表。现在,在末尾添加
标记非常简单:
s = replace(s, ". ", "</li>");
s=replace(s,“.”,“”;
但是如何用替换1.
,2.
等呢
我有一个正则表达式\d*\.$
,它将一个数字与一个句点相匹配,但问题是这是一个子字符串,所以匹配1。必须有Java 2方面的经验。团队负责人
使用\d*\.$
返回false
但是如何用替换1.
,2.
等呢
您可以使用允许regex而不是replace的:
s = s.replaceAll("\\d+\\.\\s", "</li>");
s=s.replaceAll(\\d+\\.\\s),“
”;
注意
- 您不需要在正则表达式的末尾使用
$
- 您必须转义点
,因为它表示正则表达式中的任何字符
- 您可以对一个空格使用
\s
,或对零个或多个空格使用\s*
,或对一个或多个空格使用\s+
但是如何用替换1.
,2.
等呢
您可以使用允许regex而不是replace的:
s = s.replaceAll("\\d+\\.\\s", "</li>");
s=s.replaceAll(\\d+\\.\\s),“
”;
注意
- 您不需要在正则表达式的末尾使用
$
- 您必须转义点
,因为它表示正则表达式中的任何字符
- 您可以对一个空格使用
\s
,或对零个或多个空格使用\s*
,或对一个或多个空格使用\s+
代码
替换
<li>$1</li>\n
$1 \n
后果
输入
必须有Java 2方面的经验。队长
输出
必须有Java方面的经验
队长
解释
\d+
匹配一个或多个数字
\。
按字面意思匹配点字符
\s+
匹配一个或多个空白字符
(.*)
将任意字符捕获任意次数,但尽可能少地捕获到捕获组1中
\s*
匹配任意数量的空白字符
(?=\d+\.\s+\$)
正向前瞻,确保以下任一项不匹配
\d+\.\s+
\d+
匹配一个或多个数字
\。
按字面意思匹配点字符
\s+
匹配一个或多个空白字符
$
在行尾断言位置
代码
替换
<li>$1</li>\n
$1 \n
后果
输入
必须有Java 2方面的经验。队长
输出
必须有Java方面的经验
队长
解释
\d+
匹配一个或多个数字
\。
按字面意思匹配点字符
\s+
匹配一个或多个空白字符
(.*)
将任意字符捕获任意次数,但尽可能少地捕获到捕获组1中
\s*
匹配任意数量的空白字符
(?=\d+\.\s+\$)
正向前瞻,确保以下任一项不匹配
\d+\.\s+
\d+
匹配一个或多个数字
\。
按字面意思匹配点字符
\s+
匹配一个或多个空白字符
$
在行尾断言位置
我们想要
<ol>
<li>one</li>
<li>two<li>
</ol>
一个
两个
这可以通过以下方式实现:
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>");
s=s.replaceAll(“(?s)(\\d+\\)\\s+(.\\)\\s*”,“$2 ”;
s=s.replaceFirst(“”,“ ”);
s=s.replaceAll(“(?s) ”,“ \n”;
诀窍是首先添加一个伪
,该伪
应该只保留在最后一个列表项之后
(?s)
是点球符号,导致
也匹配换行符
如果有多个编号列表,则不适用。它还假设每个列表项只有一句话。我们想要
<ol>
<li>one</li>
<li>two<li>
</ol>
一个
两个
这可以通过以下方式实现:
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>");
s=s.replaceAll(“(?s)(\\d+\\)\\s+(.\\)\\s*”,“$2 ”;
s=s.replaceFirst(“”,“ ”);
s=s.replaceAll(“(?s) ”,“ \n”;
诀窍是首先添加一个伪
,该伪
应该只保留在最后一个列表项之后
(?s)
是点球符号,导致
也匹配换行符
如果有多个编号列表,则不适用。它还假设每个列表项只有一句话。@Reimeus用户不是在解析HTML,而是在尝试生成它。@Reimeus用户不是在解析HTML,而是在尝试生成它。这是有效的,(尽管在您的回答中,字符串在需要时用替换正则表达式匹配)但是@ctwheels的答案更可靠。哦,对不起,我误解了这个评论。如果你看@ctwheels在“output”下的答案,那正是我想要的。虽然公平地说,我对开始的标签更感兴趣,但结束的标签不那么复杂。没关系@mohammedkhan这只是一个评论,我很高兴ctwheels能帮到你;)这是可行的,(虽然在您的答案中,当需要时,您的字符串将regex匹配替换为),但是@ctwheels answer更为健壮。哦,对不起,我误解了这个评论。如果你看@ctwheels在“output”下的答案,那正是我想要的。虽然公平地说,我对获得开场白更感兴趣