If-Then-Else的Java Regex投掷错误

时间:2014-08-21 14:59:29

标签: java regex

我正在尝试在Java中运行这个正则表达式语句。它应该返回false,因为正则表达式要求在第八个位置只有O,P,L或H,如果在第三个位置有“A”。

System.out.println("TLN7HRNO".matches("[-LBQTHWROMSNT](0MIL|[LBCDGJKMNPQSTUVWXYZ][NA][0137CUVRT][PCBMVWTHKNDG])(NR|RR)(?(?<=A[A-Z0-9]{4})[OPLH]|$)"));

但是,Java并不喜欢IF-THEN-ELSE语句,即使我的正则表达式编辑器工作得很好。

Java对于IF-THEN-ELSE有不同的实现,还是只是不支持它。

java.util.regex.PatternSyntaxException: Unknown inline modifier near index 81
...[PCBMVWTHKNDG])(NR|RR)(?(?<=A[A-Z0-9]{4})[OPLH]|$)
                           ^                                                 
at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.group0(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
at java.util.regex.Pattern.expr(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.<init>(Unknown Source)
at java.util.regex.Pattern.compile(Unknown Source)
at java.util.regex.Pattern.matches(Unknown Source)
at java.lang.String.matches(Unknown Source)
at com.swa.rm.pricing.PFCLInterface.launchCLInterface(PFCLInterface.java:45)
at com.swa.rm.pricing.PFCLInterface.main(PFCLInterface.java:24)

1 个答案:

答案 0 :(得分:1)

您的Pattern中存在语法错误,如评论中所述。这是一个演练:

[-LBQTHWROMSNT](0MIL|[LBCDGJKMNPQSTUVWXYZ][NA][0137CUVRT][PCBMVWTHKNDG])(NR|RR)(?(?<=A[A-Z0-9]{4})[OPLH]|$)

首先,你的角色类很丰富。 [-LBQTHWROMSNT]可以缩短为[-L-OBQ-THW]; [LBCDGJKMNPQSTUVWXYZ]使用最后一个字符部分的范围成为[LBCDGJKMNPQS-Z](NR|RR)可以更改为([NR]R),因为|替换遵循回溯性质,[]列表是最佳的,非常适合这类用法。

模式语法错误由(?(?<=引起。这是因为在正则表达式模式中,(?是一种特殊的模式语法。 ?后面的下一个字符将决定该组的性质,必须形成一个特殊的语法组 - 否则?将成为量词,并且无法遵循可量化的令牌。
在这种情况下,您的模式无法编译,因为(?(是Java中不接受的语法。

您可能打算使用非捕获组-> (?: )

了解详情:

相关问题