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$).)*)
^^^^