Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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.util.regex.Pattern,但不适用于com.oroinc.text.regex.Perl5Matcher_Java_Regex_Perl - Fatal编程技术网

正则表达式适用于java.util.regex.Pattern,但不适用于com.oroinc.text.regex.Perl5Matcher

正则表达式适用于java.util.regex.Pattern,但不适用于com.oroinc.text.regex.Perl5Matcher,java,regex,perl,Java,Regex,Perl,今天我在我们的旧代码中遇到了一个bug,它使用perl5编译器和perl5匹配器使用以下正则表达式验证英国邮政编码: ((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA)) 但是,它无法正确验证诸如“G12 4NNT”之类的邮政编码(在本例中,最后一部分仅允许是后跟2个字母的数字)。我通过使用java.util.re

今天我在我们的旧代码中遇到了一个bug,它使用
perl5编译器
perl5匹配器
使用以下正则表达式验证英国邮政编码:

((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))
但是,它无法正确验证诸如“G12 4NNT”之类的邮政编码(在本例中,最后一部分仅允许是后跟2个字母的数字)。我通过使用
java.util.regex.Pattern
类解决了这个问题,该类正确地使用了上述正则表达式,并通过了我所有的单元测试


然而,现在我很好奇为什么它不适用于
Perl5
one。这两个API所使用的正则表达式语法有根本的区别吗?

我认为问题与中的相同

如果在Java中使用
matches()
方法:

text.matches("((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))");
它与完整字符串匹配,要在Perl中具有相同的行为,必须围绕表达式锚定:

^((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))$
^
匹配字符串的开头


$
匹配字符串的结尾

这可能会有帮助-。啊,是的,我现在明白了。谢谢你让我错过的细节!