gpt4 book ai didi

java - 正则表达式非贪婪交替

转载 作者:行者123 更新时间:2023-11-30 05:41:50 25 4
gpt4 key购买 nike

我想检查文件的每一行是否与多个正则表达式模式匹配。

示例:测试我的文本文件的这一行

123;456;789

针对 3 种不同的表达方式

1.*;.*;..9
3.*;.*;787
.2.;.*;..9

当模式匹配或不匹配时执行某些操作。所以我需要知道我的所有模式中哪一个匹配或不匹配在这个例子中:只有 P1 和 P3 匹配,因此我对输入 123;456;789

执行操作 1 和操作 3

使用嵌套 for 循环的简单解决方案性能较差(由于算法)。

示例:

for(String row : rows){
for (Pattern p : patterns){
if(p.matcher(value).matches()){
//
}
}
}

我正在考虑用“|”内联多个正则表达式运算符

使用上面的示例:(1.*;.*;..9)|(3.*;.*;787)|(.2.;.*;..9)

String expression = "(1.*;.*;..9)|(3.*;.*;787)|(.2.;.*;..9)";
String value = "123;456;789";
Pattern pattern = Pattern.compile(expression);
Matcher matcher = pattern.matcher(value);

HashMap<Integer,Boolean> results= new HashMap<>();
if(matcher.matches()) {
int count = matcher.groupCount();
for (int i = 1; i <= count; ++i) {
results.put(i, matcher.group(i) != null);
}
}

但引擎停在第一个匹配的替代方案

有没有办法在一次调用中测试多种不同的模式?否则我怎样才能改进算法而不是二次的

最佳答案

这是正则表达式引擎在找到成功匹配时停止的正确行为。为了模拟你想要做的事情,你应该使用前瞻,但在某种程度上它们不会中断比赛(很快失败或很快成功)。因此,类似以下正则表达式的内容将尝试匹配三个不同的捕获组。如果捕获组内的一个正则表达式无法匹配,因为它是可选的,则尝试另一个前瞻,直到结束:

^(?=(1.*;.*;..9$)?)(?=(3.*;.*;787$)?)(?=(.2.;.*;..9$)?)

如果捕获了组,您只需稍后使用捕获组即可执行一些代码:

if (capturingGroup == 1) {
// do something
} else if (capturingGroup == 2) {
...

参见live demo here (在这里,您的两个正则表达式是匹配且可识别的)

注意:您可能需要删除点星以支持更具限制性的模式。目前匹配度非常高。

注意:由于这里的两个正则表达式不会同时匹配,您可以将上面的正则表达式更改为:

^(?:(?=(1.*;.*;..9$)?)(?=(.2.;.*;..9$)?)|(3.*;.*;787)$)

关于java - 正则表达式非贪婪交替,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55492930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com