正则表达式在组内捕获

时间:2016-05-23 18:05:50

标签: java regex

我希望能够删除<p>标记内的所有换行实例,但不能删除外部的换行符。例如:

<p dir="ltr">Test<br>\nA\naa</p>\n<p dir="ltr">Bbb</p>

这是我提出的正则表达式:

(<p[^>]*?>)(?:(.*)\n*)*(.*)(</p[^>]*?>)

我替换为:

$1$2$3$4

我希望这可行,但(?:(.*)\n*)*似乎会引发问题。有没有办法像捕捉组一样做这样的重复比赛?

提前致谢!

1 个答案:

答案 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