gpt4 book ai didi

Java 编译正则表达式错误

转载 作者:行者123 更新时间:2023-11-30 08:16:47 24 4
gpt4 key购买 nike

我大量使用正则表达式将业务参数存储在各种表中(主要是业务决策树逻辑)。当数千个业务对象尝试将自身与这些正则表达式驱动的参数进行匹配时,在各种属性上使用 String.matches() 可能会非常慢。因此,我创建了一个名为 MatchRegex 的类,它充当正则表达式字符串的属性类型,并且它在内部编译正则表达式并重置测试输入字符串。

public final class MatchRegex {
private final String regex;
private final Pattern pattern;
private final Matcher matcher;

private MatchRegex(String regex) {
this.regex = regex;
this.pattern = Pattern.compile(regex);
this.matcher = pattern.matcher("Hello");
}
public static MatchRegex of(String regex) {
return new MatchRegex(regex);
}
public boolean matches(String input) {
return matcher.reset(input).matches();
}
public String getRegex() {
return regex;
}
}

但是,我有点不安,我随机收到一个错误,除非我深入研究模式源代码,否则对我来说没有什么意义。它在 return matcher.reset(input).matches() 行失败。这是正则表达式库的错误吗?我该如何修复它?

java.lang.StringIndexOutOfBoundsException: String index out of range: 7
at java.lang.String.charAt(Unknown Source)
at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$Slice.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$GroupTail.match(Unknown Source)
at java.util.regex.Pattern$BranchConn.match(Unknown Source)
at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
at java.util.regex.Pattern$Branch.match(Unknown Source)
at java.util.regex.Pattern$GroupHead.match(Unknown Source)
at java.util.regex.Pattern$BmpCharProperty.match(Unknown Source)
at java.util.regex.Matcher.match(Unknown Source)
at java.util.regex.Matcher.matches(Unknown Source)

最佳答案

刚刚与 Jon Skeet 同一时刻意识到 Matcher 不是线程安全的。我需要使用一些线程本地化或同步。希望它不会在性能上花费太多。

更新我猜最有效的策略是每次调用一个新的匹配器。

public final class MatchRegex {
private final String regex;
private final Pattern pattern;

private MatchRegex(String regex) {
this.regex = regex;
this.pattern = Pattern.compile(regex);
}
public static MatchRegex of(String regex) {
return new MatchRegex(regex);
}
public boolean matches(String input) {
return pattern.matcher(input).matches();
}
public String getRegex() {
return regex;
}
}

关于Java 编译正则表达式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29541527/

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