Java 为什么没有为我的无效模式抛出PatternSyntaxException?
我想测试regexp在Java1.8.0241中是否有效Java 为什么没有为我的无效模式抛出PatternSyntaxException?,java,regex,unit-testing,patternsyntaxexception,Java,Regex,Unit Testing,Patternsyntaxexception,我想测试regexp在Java1.8.0241中是否有效 public static boolean isRegExpValid(String regExp) { try { Pattern.compile(regExp); return true; } catch (PatternSyntaxException e) { return false; } } 在这里,我正在测试一个三位数的正确regexp和一个不正确的re
public static boolean isRegExpValid(String regExp) {
try {
Pattern.compile(regExp);
return true;
} catch (PatternSyntaxException e) {
return false;
}
}
在这里,我正在测试一个三位数的正确regexp和一个不正确的regexp
@Test
public void testValidRegexp() {
assertTrue(isRegExpValid("\\d{3}"));
}
@Test
public void testInvalidRegexp() {
assertFalse(isRegExpValid("{3}"));
}
为什么我的第二次测试testInvalidRegexp
失败了isRegExpValid(“{3}”)
应返回false,但返回true
在Javascript中,{3}
正确地失败,出现无需重复的异常。
它似乎成功地匹配了空字符串:
jshell> Pattern.matches("{3}x", "x")
$1 ==> true
似乎没有将此定义为有效的使用,但它会传递到检测到其他次要语法问题的位置,并抛出Pattern.error
要分析实现接受此选项的原因,您需要找出在解析模式时可以从何处调用。它似乎成功地匹配了空字符串:
jshell> Pattern.matches("{3}x", "x")
$1 ==> true
似乎没有将此定义为有效的使用,但它会传递到检测到其他次要语法问题的位置,并抛出Pattern.error
要分析实现接受此选项的原因,您需要找出在解析模式时可以从何处调用。
{3}
在Java中是有效的正则表达式,但它只匹配空字符串
下面是代码演示:
jshell> Matcher m = Pattern.compile("{3}").matcher("A {3} here");
m ==> java.util.regex.Matcher[pattern={3} region=0,10 lastmatch=]
jshell> while (m.find()) { System.out.println( "<" + m.group() + "> | " + m.start() + " | " + m.end()); }
<> | 0 | 0
<> | 1 | 1
<> | 2 | 2
<> | 3 | 3
<> | 4 | 4
<> | 5 | 5
<> | 6 | 6
<> | 7 | 7
<> | 8 | 8
<> | 9 | 9
<> | 10 | 10
jshell>Matcher m=Pattern.compile(“{3}”).Matcher(“A{3}here”);
m=>java.util.regex.Matcher[pattern={3}region=0,10 lastmatch=]
jshell>while(m.find()){System.out.println(“|”+m.start()+“|”+m.end());}
| 0 | 0
| 1 | 1
| 2 | 2
| 3 | 3
| 4 | 4
| 5 | 5
| 6 | 6
| 7 | 7
| 8 | 8
| 9 | 9
| 10 | 10
根据定义贪婪量词:
X{n}
X
,正好n
次
这里的
X
只是一个空字符串,所以它的意思是一个空字符串正好是空字符串的3倍,这仍然只是一个空字符串。{3}
在Java中是一个有效的正则表达式,但它只会匹配一个空字符串
下面是代码演示:
jshell> Matcher m = Pattern.compile("{3}").matcher("A {3} here");
m ==> java.util.regex.Matcher[pattern={3} region=0,10 lastmatch=]
jshell> while (m.find()) { System.out.println( "<" + m.group() + "> | " + m.start() + " | " + m.end()); }
<> | 0 | 0
<> | 1 | 1
<> | 2 | 2
<> | 3 | 3
<> | 4 | 4
<> | 5 | 5
<> | 6 | 6
<> | 7 | 7
<> | 8 | 8
<> | 9 | 9
<> | 10 | 10
jshell>Matcher m=Pattern.compile(“{3}”).Matcher(“A{3}here”);
m=>java.util.regex.Matcher[pattern={3}region=0,10 lastmatch=]
jshell>while(m.find()){System.out.println(“|”+m.start()+“|”+m.end());}
| 0 | 0
| 1 | 1
| 2 | 2
| 3 | 3
| 4 | 4
| 5 | 5
| 6 | 6
| 7 | 7
| 8 | 8
| 9 | 9
| 10 | 10
根据定义贪婪量词:
X{n}
X
,正好n
次
这里
X
只是一个空字符串,所以它的意思是一个空字符串正好是空字符串的3倍,这仍然是一个空字符串。真的吗Pattern.matches(“{3}”,“{3}”)
产生false
Pattern-Pattern=Pattern.compile(“{3}”);pattern.asPredicate().test(“{3}”)代码>产生true
@WiktorStribiżew不产生。要从字面上匹配{3}
,正则表达式必须是的“\\{3\\}”
@VLAZ,这样测试将通过任何测试-仍然不是字面上的匹配asPredicate
由find
支持,因此在传递的任何字符串中都会找到与空字符串匹配的模式。真的吗Pattern.matches(“{3}”,“{3}”)
产生false
Pattern-Pattern=Pattern.compile(“{3}”);pattern.asPredicate().test(“{3}”)代码>产生true
@WiktorStribiżew不产生。要从字面上匹配{3}
,正则表达式必须是的“\\{3\\}”
@VLAZ,这样测试将通过任何测试-仍然不是字面上的匹配asPredicate
由find
支持,因此在传递的任何字符串中都会找到与空字符串匹配的模式。