正则表达式来分区多行字符串

Regex to partition multiline string

考虑一个由 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)^(?:(?!anchor\s*=\s*).)+?\r|\nanchor\s*=\s*([^\r\n]+)(?:\r|\n)(.*)

但上面的正则表达式包括第一个匹配组中的整个文本,并按预期填充其余 2 个组。

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

有什么想法吗?

如果你需要速度,巨大的字符串和正则表达式不是要走的路。您必须将整个字符串保存在内存中才能使用正则表达式对其进行标记化。我建议改用 Reader / InputStreams。

嗯,你可以先拿到锚点,然后在上面拆分:

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

"m" 标志使 ^ 和 $ 匹配 start/end 行。

这个正则表达式怎么样?

(?s)^(.*?)(anchor\s*\=\s*[^\r\n]+)(.*?)

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

(?s)^(.*?)(anchor\s*\=\s*[^\r\n]+)(.*?)$?