我正在尝试使用正则表达式来匹配以下格式的文件:
FILTER
<data>
ORDER
<data>
现在,<data>
部分是我需要提取的部分,这很简单,除了我有以下复杂情况:
1)可以重复此模式(中间没有换行符)
2)<data>
可能不存在。
特别是,这个文件没问题:
FILTER
test1
ORDER
test2
FILTER
test3
ORDER
FILTER
ORDER
并且应该给我以下几组:
&#34; test1&#34;,&#34; test2&#34;,&#34; test3&#34;,&#34;&#34;,&#34;&#34;,&# 34;&#34;
我已经尝试过的正则表达式是:(?:FILTER\n(.*)\nORDER\n(.*))*
Here是对regex101的测试。
我对正则表达式很新,任何帮助都会受到赞赏。
答案 0 :(得分:2)
您可以使用基于lazy-bit匹配+淬火贪婪令牌的正则表达式:
(?s)FILTER(.*?)ORDER((?:(?!FILTER).)*)
^-^ ^--------------^
对此正则表达式使用DOTALL修饰符。这是一个regex demo。 .*?
匹配任何字符,但尽可能少,因此匹配第一个ORDER
。 (?:(?!FILTER).)*
淬火贪婪令牌匹配任何非FILTER
的文本。它是多字符序列的一种否定字符类同义词。
您可以按如下方式展开它:
FILTER([^O]*(?:O(?!RDER)[^O]*)*)ORDER([^F]*(?:F(?!ILTER)[^F]*)*)
请参阅regex demo(此正则表达式不需要DOTALL模式)。
String s = "FILTER\ntest1\nORDER\ntest2\nFILTER\ntest3\nORDER\nFILTER\nORDER";
Pattern pattern = Pattern.compile("(?s)FILTER(.*?)ORDER((?:(?!FILTER).)*)");
Matcher matcher = pattern.matcher(s);
List<String> results = new ArrayList<>();
while (matcher.find()){
if (matcher.group(1) != null) {
results.add(matcher.group(1).trim());
}
if (matcher.group(2) != null) {
results.add(matcher.group(2).trim());
}
}
System.out.println(results); // => [test1, test2, test3, , , ]
请参阅IDEONE demo
如果您需要确保FILTER
和ORDER
分隔符字符串显示为单独的行,只需在它们周围使用^
和$
并添加MULTILINE修饰符(以便^
可以匹配行的开头,而$
可以匹配行的结尾):
(?sm)^FILTER$(.*?)^ORDER$((?:(?!^FILTER$).)*)
^^^^
请参阅another regex。
答案 1 :(得分:0)