我正在尝试在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)
答案 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中不接受的语法。
您可能打算使用非捕获组。 ->
(?: )
了解详情: