Regex对多行字符串进行分区



考虑一个由N lines组成的多行字符串,如下所示:

Line 1 text
Line 2 text
Line 3 text
...
Line n-1 text
Line n text
anchor=value
Line n+2 text
Line n+3 text
Line n+4 text
...
Line N text

anchor键不出现在任何一行内,在锚点之前以及之后的=符号周围可能有空格。

我需要一个正则表达式,将上面的字符串分为3组:

  1. 1号线至n号线(含)
  2. 锚索(分区点)
  3. n+2行至n行(含)

我得到的最接近解决方案是

(?s)^(?:(?!anchors*=s*).)+?r|nanchors*=s*([^rn]+)(?:r|n)(.*)

但是上面的regex包括第一个匹配组中的整个文本,并按预期填充剩余的2个组。

另一个要求是正则表达式必须尽可能快,因为它将应用于大量数据。还要注意,在这个用例中,通过单个regex进行处理是唯一的选项。

有什么想法吗?

这个正则表达式怎么样?

(?s)^(.*?)(anchors*=s*[^rn]+)(.*?)

或者,为了匹配字符串的末尾,

(?s)^(.*?)(anchors*=s*[^rn]+)(.*?)$

如果你需要速度,巨大的字符串和正则表达式是不可取的。您必须将整个字符串存储在内存中,才能使用regex来标记它。我建议您改用Reader/InputStreams。

好吧,你可以先得到锚,然后在它上拆分:

String anchor = str.replaceAll("(?ms).*?(anchor\s*=.*?)$.*", "$1");
String lineParts = str.split("\Q" + anchor + "\E");

"m"标志使^和$匹配行的开始/结束。

最新更新