可替换为'*'的重复范围是什么意思?



我在IntelliJ IDEA中执行了代码分析器,它将弱警告显示为

可由'*'替换的重复范围

它在下面的代码行中显示警告我正在使用正则表达式模式

String pattern = prefix + ".{" + length + "}" + suffix;

我不确定用*替换.{后我的代码是否能工作

简化版代码:

String code = "AUTONARNDATEST";
String prefix = "AUTO";
String suffix = "TEST";
String length = "6";
String pattern = prefix + ".{" + length + "}" + suffix;
if(code.matches(pattern)) {
System.out.println("thumbs_up");
}else {
System.out.println("thumbs_down");
}

有人能帮忙吗。

问题是由Intellij IDEA中的分析器引起的。这是相关部分:

@Override
public void visitRegExpQuantifier(RegExpQuantifier quantifier) {
if (quantifier.isCounted()) {
final RegExpNumber minElement = quantifier.getMin();
final String min = minElement == null ? "" : minElement.getText();
final RegExpNumber maxElement = quantifier.getMax();
final String max = maxElement == null ? "" : maxElement.getText();
if (!max.isEmpty() && max.equals(min)) {
...........
}
else if (("0".equals(min) || min.isEmpty()) && "1".equals(max)) {
..........
}
else if (("0".equals(min) || min.isEmpty()) && max.isEmpty()) {
myHolder.newAnnotation(HighlightSeverity.WEAK_WARNING, RegExpBundle.message("weak.warning.repetition.range.replaceable.by.0", "*"))
.withFix(new SimplifyQuantifierAction(quantifier, "*")).create();
}
...........

在这种情况下,它看到字符串.{,并将其解释为minmax范围都为空的量词,因为它无法静态解析length的内容,并且minElement/maxElement.getText((返回null。因此,它落在产生警告的分支上。如果IDEA可以静态解析length,则不会出现警告:

String length = "6";
String pattern = ".{" + length + "}";  // No warning
if ("a".matches(pattern)) ;

比较:

String length = new Scanner(System.in).nextLine();
String pattern = ".{" + length + "}";  // Warning, cannot statically parse length
if ("a".matches(pattern)) ;

正如我在评论中提到的,如果你用String.format:生成模式,你可以避免它

String pattern = String.format("%s.{%s}%s", prefix, length, suffix);

相关内容

最新更新