Regex:非法的十六进制转义序列



我是Regex的新手。。我编写了以下正则表达式来检查javascript中的电话号码:^[0-9+-s()[]x]*$

现在,我使用以下代码在java中尝试同样的事情:

public class testRegex {
    public static void main(String[] args){
    String regex="^[0-9\+\-\s\(\)\[\]\x]*$";
    String phone="98650056";
    System.out.println(phone.matches(regex));
}

然而,我总是得到以下错误:

Exception in thread "main" java.util.regex.PatternSyntaxException: 
    Illegal hexadecimal escape sequence near index 21^[0-9+-s\(\)\[\]x]*$

请告知。

由于您试图匹配我假设的x(如在电话扩展中),因此需要使用四个反斜杠进行转义,或者根本不进行转义;否则CCD_ 3被解释为十六进制转义码。因为x被解释为一个十六进制代码,没有两到四个额外的必需字符,所以这是一个错误。

     [\x] x{nn} or {nnnn} (hex code nn to nnnn)
   [\\x] x (escaped)
       [x] x

因此,模式变为:

String regex="^[-0-9+()\s\[\]x]*$";

逃避的替代品:

String regex="^[0-9\+\-\s\(\)\[\]x]*$";
String regex="^[0-9\+\-\s\(\)\[\]\\x]*$";

你有太多的反斜杠!

首先,要在java中编写一个字面反斜杠,必须编写其中两个

其次,在字符类中,大多数字符都会失去其特殊的正则表达式含义。

第三,x引入了一个十六进制文字——你不希望这样。

这样写正则表达式:

String regex="^[0-9+\s()\[\]x-]*$";

请注意,当字符类中的连字符出现在第一个或最后一个时,不需要对其进行转义。

最新更新