Java 用于分区多行字符串的正则表达式

Java 用于分区多行字符串的正则表达式,java,regex,multiline,multilinestring,Java,Regex,Multiline,Multilinestring,考虑由N行组成的多行字符串,如下所示: 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键不会出现在任何行内,并且在anchor之前以及其后的=符号周围可能会有空格 我需要一个将上述字符串划分为3组的正则表达式: 第1行至第n行(含) 锚索(分隔点) 第n+2

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

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
键不会出现在任何行内,并且在anchor之前以及其后的
=
符号周围可能会有空格

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

  • 第1行至第n行(含)
  • 锚索(分隔点)
  • 第n+2行至第n行(含)
  • 我能找到的最接近解决方案是

    (?s)^(?:(?!anchor\s*=\s*).)+?\r|\nanchor\s*=\s*([^\r\n]+)(?:\r|\n)(.*)
    
    但是上面的正则表达式包含第一个匹配组中的整个文本,并按预期填充剩余的两个组

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


    有什么想法吗?

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

    如果你需要快速的大字符串,而regex不是最好的选择。您必须将整个字符串存储在内存中,才能使用正则表达式对其进行标记化。我的建议是改用Reader/InputStreams。

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

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

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

    好吧,您可以先获得锚,然后在锚上拆分:

    String anchor = str.replaceAll("(?ms).*?(anchor\\s*=.*?)$.*", "$1");
    String lineParts = str.split("\\Q" + anchor + "\\E");
    
    “m”标志使“^”和“$”匹配行的开始/结束。

    这个正则表达式怎么样

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

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

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

    这个正则表达式怎么样

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

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


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

    当然可以,但是在这个用例中,输出来自一个只允许通过正则表达式进行自定义的库。现在我更困惑了。如果输出来自库,为什么要进行拆分?您的意思是字符串由库返回吗?它由允许“注入”正则表达式的库处理。@PNS“仅允许通过正则表达式自定义的库”此信息应放在您的问题中。还请描述您的库将如何准确应用此正则表达式:它是
    split
    的参数还是
    find()
    ?不,它将应用于示例中的文本块,因此我们可能正在查找匹配项()。当然,但是在这个用例中,输出来自一个只允许通过正则表达式进行定制的库。如果输出来自库,为什么要进行拆分?您的意思是字符串由库返回吗?它由允许“注入”正则表达式的库处理。@PNS“仅允许通过正则表达式自定义的库”此信息应放在您的问题中。还请描述您的库将如何准确地应用此正则表达式:它是
    split
    的参数还是
    find()
    ?不,它应用于示例中的文本块,因此我们可能正在查找匹配项()。谢谢,但这里需要的是一个能够完成所有操作的正则表达式,因为代码不允许任何其他内容+1.:-)谢谢,但是这里需要的是一个单独的正则表达式来完成所有的工作,因为代码不允许其他任何东西+1.:-)如果最后一个组中的非贪婪操作符变得贪婪,则第一个操作有效。秒按原样工作。谢谢@PNS,不客气。我知道
    (.*)
    模式可能需要一些边界才能达到,所以我添加了第二个选项。是的,它们看起来不错。谢谢。如果最后一组中的非贪婪操作符变得贪婪,第一组就可以工作。秒按原样工作。谢谢@PNS,不客气。我知道
    (.*)
    模式可能需要一些边界才能达到,所以我添加了第二个选项。是的,它们看起来不错。谢谢