我在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();
}
...........
在这种情况下,它看到字符串.{
,并将其解释为min
和max
范围都为空的量词,因为它无法静态解析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);