Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于匹配特定文件格式和空字符串的正则表达式_Java_Regex - Fatal编程技术网

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

Java 用于匹配特定文件格式和空字符串的正则表达式,java,regex,Java,Regex,我正在尝试使用正则表达式匹配以下格式的文件: FILTER <data> ORDER <data> 应该给我以下几组: 测试1、测试2、测试3、测试 我已经尝试过的正则表达式是:(?:FILTER\n(.*)\nORDER\n(.*)* 是对regex101的测试 我对regex非常陌生,如果您能提供任何帮助,我将不胜感激。我将使用以下regex: FILTER(?:\n(?!ORDER)(.*))?\nORDER(?:\n(?!FILTER)(.*))? 您可以在上

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

FILTER
<data>
ORDER
<data>
应该给我以下几组:

测试1、测试2、测试3、测试

我已经尝试过的正则表达式是:
(?:FILTER\n(.*)\nORDER\n(.*)*

是对regex101的测试


我对regex非常陌生,如果您能提供任何帮助,我将不胜感激。

我将使用以下regex:

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

您可以在

上测试它。您可以使用基于标记的惰性点匹配正则表达式:

(?s)FILTER(.*?)ORDER((?:(?!FILTER).)*)
           ^-^       ^--------------^
将点所有修饰符与此正则表达式一起使用。这是一本书。
*?
匹配任何字符,但尽可能少,因此,匹配到第一个
顺序
(?:(?!FILTER.)*
标记匹配任何不是
过滤器的文本。它是一种多字符序列的否定字符类同义词

您可以按如下方式展开它:

FILTER([^O]*(?:O(?!RDER)[^O]*)*)ORDER([^F]*(?:F(?!ILTER)[^F]*)*)
请参阅(此正则表达式不需要点调用模式)


请参见。

我将其简化为:然后相应地剥离换行符。请注意,您需要包含
s
修饰符,以便将换行符与不太有效的点
@HamZa匹配。。。另外,我真的不明白你在我的正则表达式中添加了
m
修饰符,这将改变整个含义。移除它。(我让我的正则表达式可以点击?@HamZa哦,现在看起来不错。谢谢:D@sadfsasdfasdf:请注意,我的展开正则表达式可能比。我刚刚对它进行了更新,以消除对尾随换行的需要,现在是否更好?Wiktor的答案更符合需要,您的答案不会给出空字符串。Hu?它确实给出了空字符串,以您的示例为例,组2在第二场比赛中为空,组1和组2在最后一场比赛中均为空。这看起来不错,但“展开”是什么意思?为什么有
!在
过滤器
之后进行过滤器
,但没有
!订单
订单
之后?此外,您不限制进行全线测试,因此
abcFILTER
的值将造成严重破坏。@Andreas:此模式可以重复(中间没有换行)。内部只有一个顺序,因此第二个标记不应跳过起始分隔符,即此处的
FILTER
。通过一个标记,我们可以添加单词边界和其他限制。只需要OP提供更多反馈。@sadfasdfasdf:如果当前正则表达式适用于您,下面是一个展开的版本:。它不需要DOTALL Modifier跨行匹配。我认为这个问题相当清楚<代码>筛选器
订单
必须是单独行上的令牌,即
(?m)^FILTER$
(?m)^ORDER$
。另外,格式是
过滤器顺序
,因此如果中间没有
顺序
,则不能有
过滤器
。你的正则表达式没有遵守这些规则。
FILTER([^O]*(?:O(?!RDER)[^O]*)*)ORDER([^F]*(?:F(?!ILTER)[^F]*)*)
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, , , ]
(?sm)^FILTER$(.*?)^ORDER$((?:(?!^FILTER$).)*)
 ^^^^