如何在正则表达式(XSD Pattern)上验证给定的字符串:
xsd pattern:'([a-zA-Z0-9。,;:'+ - /()?* [] {} \`'〜 ] | [“#%&安培;!<>÷= @ _ $£] | [àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ])*'
我需要用上面的模式验证字符串是否匹配。
我尝试了以下代码,但在编译时遇到了不受支持的转义字符错误
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternMatching {
private static Pattern usrNamePtrn = Pattern.compile("([a-zA-Z0-9\.,;:'\+\-/\(\)?\*\[\]\{\}\\`´~ ]|[!"#%&<>÷=@_$£]|[àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ])*");
public static boolean validateUserName(String userName){
Matcher mtch = usrNamePtrn.matcher(userName);
if(mtch.matches()){
return true;
}
return false;
}
public static void main(String a[]){
System.out.println("Is a valid username?"+validateUserName("stephen & john"));
}
}
如何执行上述任务,除了如果与模式不匹配那么需要显示的字符。我正在使用java 1.6任何建议表示赞赏
答案 0 :(得分:1)
错误1:
反斜杠是一个特殊字符,用于转义跟随它的任何字符。因此,序列
\`
要么与单个反引号相同,要么根据正则表达式引擎是非法转义序列。无论哪种方式,如果意图是将反斜杠与所有其他字符匹配,则应将其写为:
\\`
错误2:
在[
... ]
字符分组中,]
必须进行转义,因此不表示分组结束。因此,[]
需要写为[\]
。
错误3:
在[
... ]
字符分组中,-
表示字符范围,如a-z
。正则表达式[+-/]
并不意味着“加号或连字号或斜线”;它的意思是“加号和斜杠之间的任何字符,包括在内。”从技术上讲,这个错误不会影响这个特定情况下的结果,因为+-/
等同于这三个字符加上逗号和句点,无论如何,两者都恰好发生在角色分组的早期。但是,为了说出你的意思,-
应该被转义:
+\-/
反斜杠和双引号是Java中的特殊字符。显然,"
表示字符串文字的开头和结尾,因此如果你想在字符串中使用"
,你必须将其转义:
\"
这与正则表达式无关;这只是告诉编译器String包含双引号字符。它将被编译为单个"
,这就是正则表达式引擎将看到的内容。
最后,还有反斜杠的问题。碰巧的是,虽然正则表达式使用反斜杠来转义字符,如上所述,但Java也使用反斜杠来转义字符串中的字符。这意味着如果你想在Java String中使用文字反斜杠,它必须在代码中写成两个反斜杠:
String s = "\\"; // a String of length 1
回想一下,我们需要一个带有连续反斜杠字符的正则表达式:
\\`
包含这三个字符的Java字符串如下所示:
String s = "\\\\`"; // a String of length 3
正则表达式几乎可以在任何地方使用反斜杠;例如,\%
与%
相同。但是,Java only allows specific characters to be preceded by a single backslash. \+
不是允许的序列之一。
+
,(
,)
,{
和}
不是[
中的特殊字符... ]
分组,所以无论如何都没有必要逃避它们。
因此,您的代码需要更改:
private static Pattern usrNamePtrn = Pattern.compile("([a-zA-Z0-9\.,;:'\+\-/\(\)?\*\[\]\{\}\\`´~ ]|[!"#%&<>÷=@_$£]|[àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ])*");
到此:
private static Pattern usrNamePtrn = Pattern.compile("([a-zA-Z0-9.,;:'+\\-/()?*\\[\\]{}\\\\`´~ ]|[!\"#%&<>÷=@_$£]|[àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ])*");
答案 1 :(得分:0)
这是因为"
是Java中的特殊字符。
您必须使用转义字符"
替换\"
,\
和\\
替换为private static Pattern usrNamePtrn = Pattern.compile("([a-zA-Z0-9.,;:'+-/()?*[]{}\\`´~ ]|[!\"#%&<>÷=@_$£]|[àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ])*");
,如下所示:
"
请注意\
和\"
取代\\
和body {
background-image: url(2cg3c.jpg);
}
ul {
margin: 0;
padding: 0;
list-style: none;
}
ul li a {
text-decoration: none;
color: white;
display: block;
}
ul li {
float: left;
width: 200px;
height: 40px;
background-color: black;
font-size: 20px;
line-height: 40px;
text-align: center;
opacity: .7;
border: 3px solid #285189;
}
ul li a:hover {
background-color: red;
}
ul li ul li {
display: none;
}
ul li:hover ul li {
display: block
}
下方模式的变化:
另请注意,这只会修复编译问题。您需要重新检查您的Regex以查看它是否正常工作。