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
正则表达式可用于提取所有序列(即上面的sequence1
、sequence2
、sequence3
、sequence4
)?例如,一个 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));
}
给出的文本摘录如
Preface (optional, up to multiple lines)
Main : sequence1
sequence2
sequence3
sequence4
Epilogue (optional, up to multiple lines)
哪个Java
正则表达式可用于提取所有序列(即上面的sequence1
、sequence2
、sequence3
、sequence4
)?例如,一个 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));
}