Java 重复范围由'*';什么意思?
我在IntelliJ IDEA中执行了代码分析器,它显示弱警告,如下所示: 重复范围可由“*”替换 它在我使用正则表达式模式的代码行下方显示警告Java 重复范围由'*';什么意思?,java,intellij-idea,Java,Intellij Idea,我在IntelliJ IDEA中执行了代码分析器,它显示弱警告,如下所示: 重复范围可由“*”替换 它在我使用正则表达式模式的代码行下方显示警告 String pattern = prefix + ".{" + length + "}" + suffix; 我不确定我的代码在用*替换{后是否能工作 代码的简化版本: String code = "AUTONARNDATEST"; String prefix = "AUTO"; String suffix = "TEST"; String le
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中的analyzer引起的。以下是相关部分:
@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可以静态解析长度
,则警告不会出现:
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);
无法复制。您能提供一个警告吗?您知道
*
与{10}
(或任意长度)相对的作用吗?该警告绝对不正确。您需要一定数量的“任意字符”.My$0.02:代码分析器要么混乱,要么过于谨慎,或者两者兼而有之。您知道自己做的事情是正确的(;->),所以请忽略警告并继续。如果您执行String pattern=String.format(“%s.{%s}%s”,前缀、长度、后缀);