我希望能够删除<p>
标记内的所有换行实例,但不能删除外部的换行符。例如:
<p dir="ltr">Test<br>\nA\naa</p>\n<p dir="ltr">Bbb</p>
这是我提出的正则表达式:
(<p[^>]*?>)(?:(.*)\n*)*(.*)(</p[^>]*?>)
我替换为:
$1$2$3$4
我希望这可行,但(?:(.*)\n*)*
似乎会引发问题。有没有办法像捕捉组一样做这样的重复比赛?
提前致谢!
答案 0 :(得分:2)
<强>解决方案强>
您可以使用此正则表达式(适用于PCRE但不适用于Java。适用于Java版本,请参阅下文)
(?s)(?:<p|\G(?!\A))(?:(?!<\/p>).)*?\K[\n\r]+
<强> Regex Demo 强>
正则表达式细分
(?s) #Enable . to match newlines
(?:
<p #this part is to assure that whatever we find is inside <p tag
| #Alternation(OR)
\G(?!\A) #Find the position of starting of previous match.
)
(?:
(?!<\/p>). #Till it is impossible to match </p>, match .
)*? #Do it lazily
\K #Whatever is matched till now discard it
[\n\r]+ #Find \n or \r
Java代码
通过一些修改,我能够用Java实现它
String line = "<p dir=\"ltr\">Test<br>\nA\naa</p>\nabcd\n<p dir=\"ltr\">Bbb</p>";
System.out.println(line.replaceAll("(?s)((?:<p|\\G(?!\\A))(?:(?!<\\/p>).)*?)[\\n\\r]+", "$1"));
<强> Ideone Demo 强>