Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在组内捕获正则表达式_Java_Regex - Fatal编程技术网

Java 在组内捕获正则表达式

Java 在组内捕获正则表达式,java,regex,Java,Regex,我希望能够删除标记内的所有换行符实例,但不能删除外部的换行符实例。例如: <p dir="ltr">Test<br>\nA\naa</p>\n<p dir="ltr">Bbb</p> 我希望这能起作用,但(?:(.*)\n*)*似乎引起了一些问题。有没有办法通过一个抓捕小组进行这样的重复匹配 提前谢谢 解决方案 您可以使用此正则表达式(在PCRE中工作,但在Java中不工作。有关Java版本,请参阅下面的) (?s)(?:有两个p标

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

<p dir="ltr">Test<br>\nA\naa</p>\n<p dir="ltr">Bbb</p>
我希望这能起作用,但
(?:(.*)\n*)*
似乎引起了一些问题。有没有办法通过一个抓捕小组进行这样的重复匹配

提前谢谢


解决方案

您可以使用此正则表达式(在PCRE中工作,但在Java中不工作。有关Java版本,请参阅下面的


(?s)(?:有两个
p
标记?你想分别为它们删除
\n
标记吗?分别为
p
标记是可以的。只是我希望一次性替换
p
标记中的所有
\n
标记。我希望可以使用没有嵌套循环的正则表达式。我建议使用like JSoup做这种工作。@这个人说得通。谢谢。天哪……哇。这真是太神奇了。该死的regex noobness!干得好rock-我太慢了,不能成为救世主。@Jun首先让我用Java检查一下,我正要添加答案
“(?s)\\n+(?=(?):(?!@rock321987您的模式更准确,如果有一个长html输入,并且有许多
\n

(<p[^>]*?>)(?:(.*)\n*)*(.*)(</p[^>]*?>)
$1$2$3$4
(?s)(?:<p|\G(?!\A))(?:(?!<\/p>).)*?\K[\n\r]+
(?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
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"));