java正则表达式模式匹配与模式验证

时间:2017-03-30 10:41:43

标签: java regex xsd

请考虑正则表达式:.*[a-zA-Z0-9\\-\\_].* 如果我使用 Java 正则表达式模式匹配来匹配"-",则表示它是 true

String regexCostcode1=".*[a-zA-Z0-9\\-\\_].*";
Pattern regex_costcode=Pattern.compile(regexCostcode1);
String test="-";
Matcher m = regex_costcode.matcher(test);
System.out.println(m.matches());

这会打印 true
但在 XSD架构验证中,"-"的相同正则表达式失败。

我使用http://regexr.com/检查了它无法与"-"匹配。

那么为什么使用 Java 模式匹配进行匹配?

2 个答案:

答案 0 :(得分:2)

请注意,在Java字符串文字中,您需要2个反斜杠来定义文字反斜杠。在regexr.com或XML Schema正则表达式中使用\\时,使用与输入字符串中的文字反斜杠匹配的2个字面反斜杠,[\\-\\]构造与单个{{1}匹配}。

在XML Schema中,您需要将正则表达式定义为

\

<xs:pattern value=".*[a-zA-Z0-9_-].*"/> 放在要解析的字符类的末尾,作为文字-。下划线根本不需要转义,因为它永远不是一个特殊的字符(它实际上是一个&#34;字&#34; char)。

实际上,我建议在Java中使用-,以避免任何歧义。

答案 1 :(得分:1)

对于非Java正则表达式,您不需要使用双反斜杠。所以你的正则表达式应该是Java中的.*[a-zA-Z0-9\\-\\_].*和XSD模式验证中的.*[a-zA-Z0-9\-\_].*

如果您在自己提到的网站中输入.*[a-zA-Z0-9\\-\\_].*,则会告诉您\\-\\被解释为“从\到\”的字符范围,因为\\只是转义反斜杠。
如果您输入.*[a-zA-Z0-9\-\_].*,则会将\-解释为仅仅是转义的超级广告并正确匹配-