Java 用于跨多行提取文本序列的正则表达式

Java regex to extract text sequences across multiple lines

给出的文本摘录如

Preface (optional, up to multiple lines)
Main : sequence1
   sequence2
   sequence3
   sequence4
Epilogue (optional, up to multiple lines)

哪个Java正则表达式可用于提取所有序列(即上面的sequence1sequence2sequence3sequence4)?例如,一个 Matcher.find() 循环?

每个 "sequence" 前面都有并且可能包含 0 个或多个空格(包括制表符)。

以下正则表达式

(?m).*Main(?:[ |t]+:(?:[ |t]+(\S+)[\r\n])+

仅生成第一个序列 (sequence1)。

您可以使用以下 regex:

(?m)(?:\G(?!\A)[^\S\r\n]+|^Main\s*:\s*)(\S+)\r?\n?

详情:

  • (?m) - 开启多行模式
  • (?:\G(?!\A)[^\S\r\n]+|^Main\s*:\s*) - 两者之一:
    • \G(?!\A)[^\S\r\n]+ - 上一个成功匹配的结尾(\G(?!\A)),然后是 1+ 个水平空格([^\S\r\n]+,可以替换为 [\p{Zs}\t]+[\s&&[^\r\n]]+)
    • | - 或
    • ^Main\s*:\s* - 行首,Main,0+ 个空格,:,0+ 个空格
  • (\S+) - 第 1 组捕获 1+ 个非空白符号
  • \r?\n? - 一个可选的 CR 和一个可选的 LF。

请参阅下面的 Java 代码:

String p = "(?m)(?:\G(?!\A)[^\S\r\n]+|^Main\s*:\s*)(\S+)\r?\n?";
String s = "Preface (optional, up to multiple lines)...\nMain : sequence1\n   sequence2\n   sequence3\n   sequence4\nEpilogue (optional, up to multiple lines)";
Matcher m = Pattern.compile(p).matcher(s);
while(m.find()) {
    System.out.println(m.group(1));
}