遇到一种情况,只要开始和结束序列在一行上并且不分段,我构建的正则表达式就可以正常工作。例如,如果需要从 ABCDE 和 VWXYZ 序列之间的以下文本中提取内容,则应返回 1234567890@#$@#$@##
:
-@$@$@#@$@AB
CDE123456789
0@#$@#$@##VW
XYZ00000
在这两个实例中 ABCDE 是不同的。我希望 Java 有一种方法可以满足这个需求。
谢谢
最佳答案
您可以使用 String pat = "(?s)A\\R*B\\R*C\\R*D\\R*E(.*?)V\\R*W\\R*X\\R*Y\\R*Z"
,其中 \\R*
匹配零个或多个换行符,而 (?s)
使 .*?
中的点尽可能少地匹配零个或多个字符(包括换行符)(由于 *?
惰性量词)。
参见 this IDEONE demo:
String pat = "(?s)A\\R*B\\R*C\\R*D\\R*E(.*?)V\\R*W\\R*X\\R*Y\\R*Z";
String s = "-@$@$@#@$@AB\nCDE123456789\n0@#$@#$@##VW\nXYZ00000";
Matcher m = Pattern.compile(pat).matcher(s);
while(m.find())
{
System.out.println(m.group(1));
}
如果效果不佳,您可以尝试另一个展开的正则表达式,但其性能将取决于您的内容中有多少个 V
符号:
String pat = "A\\R*B\\R*C\\R*D\\R*E([^V]*(?:V(?!\\R*W\\R*X\\R*Y\\R*Z)[^V]*)*)V\\R*W\\R*X\\R*Y\\R*Z";
如果字母之间可能有空格,请使用 \s*
而不是 \R*
:
String pat = "(?s)A\\s*B\\s*C\\s*D\\s*E(.*?)V\\s*W\\s*X\\s*Y\\s*Z"
// or
String pat = "A\\s*B\\s*C\\s*D\\s*E([^V]*(?:V(?!\\s*W\\s*X\\s*Y\\s*Z)[^V]*)*)V\\s*W\\s*X\\s*Y\\s*Z";
关于java - 如何处理其开头和/或结尾分为两行的正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38894131/