0

考虑一个由 组成的多行字符串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 个组。

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

有任何想法吗?

4

3 回答 3

2

这个正则表达式呢?

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

或者,要匹配字符串的结尾,

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

于 2015-03-02T22:28:55.790 回答
1

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

于 2015-03-02T22:18:02.687 回答
1

好吧,您可以先获得锚点,然后对其进行拆分:

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

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

于 2015-03-02T22:18:33.263 回答