Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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中正则表达式的字符串验证_Java_Regex - Fatal编程技术网

java中正则表达式的字符串验证

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

如何通过正则表达式(XSD模式)验证给定字符串:

xsd模式:'([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"));

    }
}
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谢谢!我刚刚意识到这个正则表达式还有其他问题,因为它有
等,在正则表达式和