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

时间:2017-01-04 19:05:01

标签: java regex

如何在正则表达式(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任何建议表示赞赏

2 个答案:

答案 0 :(得分:1)

首先,正则表达式本身有三个错误。

错误1:

反斜杠是一个特殊字符,用于转义跟随它的任何字符。因此,序列

\`

要么与单个反引号相同,要么根据正则表达式引擎是非法转义序列。无论哪种方式,如果意图是将反斜杠与所有其他字符匹配,则应将其写为:

\\`

错误2:

[ ... ]字符分组中,]必须进行转义,因此不表示分组结束。因此,[]需要写为[\]

错误3:

[ ... ]字符分组中,-表示字符范围,如a-z。正则表达式[+-/]并不意味着“加号或连字号或斜线”;它的意思是“加号和斜杠之间的任何字符,包括在内。”从技术上讲,这个错误不会影响这个特定情况下的结果,因为+-/等同于这三个字符加上逗号和句点,无论如何,两者都恰好发生在角色分组的早期。但是,为了说出你的意思,-应该被转义:

+\-/

其次是将正则表达式转换为Java字符串。

反斜杠和双引号是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 }下方模式的变化:

Change(s)

另请注意,这只会修复编译问题。您需要重新检查您的Regex以查看它是否正常工作。