Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么没有为我的无效模式抛出PatternSyntaxException?_Java_Regex_Unit Testing_Patternsyntaxexception - Fatal编程技术网

Java 为什么没有为我的无效模式抛出PatternSyntaxException?

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

我想测试regexp在Java1.8.0241中是否有效

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
支持,因此在传递的任何字符串中都会找到与空字符串匹配的模式。