java中正则表达式的字符串验证
如何通过正则表达式(XSD模式)验证给定字符串: xsd模式:'([a-zA-Z0-9.,;:'+-/()?*[]{}\''~ ]|[!“%和÷=@$!” 我需要用上面的模式验证字符串是否匹配 我尝试了下面的代码,但编译时出现了不支持的转义字符错误java中正则表达式的字符串验证,java,regex,Java,Regex,如何通过正则表达式(XSD模式)验证给定字符串: xsd模式:'([a-zA-Z0-9.,;:'+-/()?*[]{}\''~ ]|[!“%和÷=@$!” 我需要用上面的模式验证字符串是否匹配 我尝试了下面的代码,但编译时出现了不支持的转义字符错误 import java.util.regex.Matcher; import java.util.regex.Pattern; public class PatternMatching { private static Pattern u
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"));
}
}
import java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类模式匹配{
私有静态模式usrNamePtrn=Pattern.compile([a-zA-Z0-9\,:“\+-/\(\)?\*\[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
公共静态布尔validateUserName(字符串用户名){
Matcher mtch=usrNamePtrn.Matcher(用户名);
if(mtch.matches()){
返回true;
}
返回false;
}
公共静态void main(字符串a[]{
System.out.println(“是有效的用户名吗?”+validateUserName(“stephen&john”));
}
}
如何完成上述任务,此外,如果与模式不匹配,则需要显示字符。我使用的是java 1.6,请提供任何建议。这是因为“
是java中的一个特殊字符
您必须将“
替换为转义字符,即\”
和\
替换为\
,如下所示:
private static Pattern usrNamePtrn = Pattern.compile("([a-zA-Z0-9.,;:'+-/()?*[]{}\\`´~ ]|[!\"#%&<>÷=@_$£]|[àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ])*");
private static Pattern usrNamePtrn=Pattern.compile([a-zA-Z0-9.;:'+-/()?*[}\\\\\\\\\\][!\”)“%&=''.$”)[a-zA-Z0-Z0-9.:'+-/(?*.[]%&=''.''''.'.'''.'.'''.'.''''.'''''.'.'.''.'.'.'.''.'.'.'''.''''''.'.'.'''.''''''.''.''''.'.'.'''''.'.'''.'.'''.'.'''''.'.'''.'.''.';
注意下面模式中的更改,其中“
和\
已被\”
和\
替换:
另外,请注意,这只会修复编译问题。您需要重新检查正则表达式,看看它是否工作正常。首先,正则表达式本身有三个错误。
错误1:
反斜杠是一种特殊字符,用于转义其后的任何字符。因此,序列
\`
与单个反引号相同,或者是非法转义序列,具体取决于正则表达式引擎。无论哪种方式,如果目的是将反斜杠与所有其他字符匹配,则应将其写成:
\\`
错误2:
在[
..]
字符分组中,必须对]
进行转义,因此它不表示分组结束。因此,[]
需要写成[\]
错误3:
在[
..]
字符分组中,-
表示字符范围,如a-z
。正则表达式[+-/]
并不表示“加号、连字符或斜杠”;它的意思是“加号和斜杠之间的任何字符,包括在内。”从技术上讲,这个错误不会影响这种特殊情况下的结果,因为+-/
相当于这三个文字字符加上逗号和句点,这两个字符在字符分组中都出现得更早。但是,为了说明您的意思,应该转义-
:
+\-/
第二个问题是将正则表达式转换为Java字符串。
反斜杠和双引号是Java中的特殊字符。显然,“
表示字符串文字的开始和结束,因此如果希望在字符串中包含”
,则必须对其进行转义:
\”
这与正则表达式无关;它只是告诉编译器字符串包含一个双引号字符。它将被编译成一个“
,这就是正则表达式引擎将看到的
最后,还有反斜杠的问题。正如上面所述,正则表达式使用反斜杠来转义字符,而Java也使用反斜杠来转义字符串中的字符。这意味着,如果要在Java字符串中使用文字反斜杠,则必须将其作为两个反斜杠写入代码中:
String s = "\\"; // a String of length 1
回想一下,我们需要一个带有连续反斜杠字符的正则表达式:
\\`
包含这三个字符的Java字符串如下所示:
String s = "\\\\`"; // a String of length 3
正则表达式几乎在任何地方都允许反斜杠;例如,\%
与%
相同。但是,\+
不是允许的序列之一
+
,(
,)
,{
和}
不是[
..]
分组中的特殊字符,因此无需转义它们
因此,您的代码需要从此处更改:
private static Pattern usrNamePtrn = Pattern.compile("([a-zA-Z0-9\.,;:'\+\-/\(\)?\*\[\]\{\}\\`´~ ]|[!"#%&<>÷=@_$£]|[àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ])*");
private static Pattern usrNamePtrn=Pattern.compile(“[a-zA-Z0-9\,:”+\-/\(\)?*[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
为此:
private static Pattern usrNamePtrn = Pattern.compile("([a-zA-Z0-9.,;:'+\\-/()?*\\[\\]{}\\\\`´~ ]|[!\"#%&<>÷=@_$£]|[àáâäçèéêëìíîïñòóôöùúûüýßÀÁÂÄÇÈÉÊËÌÍÎÏÒÓÔÖÙÚÛÜÑ])*");
private static Pattern usrNamePtrn=Pattern.compile([a-zA-Z0-9.;:“+\-/()?*[\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\''.].[!\”%&====$$$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\;
如果您能提供一些代码片段,则必须将“替换为\”。我不需要更改“with\”,它不是**,而是引起问题的“
。请检查下面的答案。这不会编译。您对“
字符的看法是正确的,但第一个字符范围有两个问题:一个未替换的连字符,以及一个反斜杠位于反引号之前。@VGR谢谢!我刚刚意识到这个正则表达式还有其他问题,因为它有(
和)
等,在正则表达式和