正则表达式匹配特定的文件格式和空字符串

时间:2016-05-13 15:38:37

标签: java regex

我正在尝试使用正则表达式来匹配以下格式的文件:

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的测试。

我对正则表达式很新,任何帮助都会受到赞赏。

2 个答案:

答案 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

如果您需要确保FILTERORDER分隔符字符串显示为单独的行,只需在它们周围使用^$并添加MULTILINE修饰符(以便^可以匹配行的开头,而$可以匹配行的结尾):

(?sm)^FILTER$(.*?)^ORDER$((?:(?!^FILTER$).)*)
 ^^^^

请参阅another regex

答案 1 :(得分:0)

我会使用以下正则表达式:

FILTER(?:\n(?!ORDER)(.*))?\nORDER(?:\n(?!FILTER)(.*))?

您可以在regex101

上进行测试