java - 如何处理其开头和/或结尾分为两行的正则表达式?

标签 java regex newline

遇到一种情况,只要开始和结束序列在一行上并且不分段,我构建的正则表达式就可以正常工作。例如,如果需要从 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/

相关文章:

java - 枚举 : get the keys list

javascript - 如何使用 Javascript/jQuery 在 URL 中添加或替换查询参数?

Java System.in、换行符和解析命令行

java - 相当于Java中的C++头文件?

java - maven远程tomcat配置

regex - 正则表达式匹配文本中带或不带逗号和小数的数字

ios - 换行符不适用于 Swift 中的 txt 文件

java - 我无法在文件的新行中写入数据

java - 如何判断哪个项目触发了鼠标监听器

r - 如何在 R 中提取与正则表达式 (regexpr) 索引相关的文本