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,不客气。我知道(.*)
模式可能需要一些边界才能达到,所以我添加了第二个选项。是的,它们看起来不错。谢谢