请考虑正则表达式:.*[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 模式匹配进行匹配?
答案 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\-\_].*
,则会将\-
解释为仅仅是转义的超级广告并正确匹配-
。