正则表达式:非法的十六进制转义序列

时间:2014-09-15 08:46:41

标签: java regex regular-language

我是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]*$

请告知。

2 个答案:

答案 0 :(得分:4)

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

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

因此模式变为:

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

Escaped Alternatives:

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

答案 1 :(得分:0)

你有太多反斜杠了!

首先,要编写java中的文字反斜杠,必须编写两个

其次,大多数角色在角色类中都会失去特殊的正则表达式。

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

像这样写你的正则表达式:

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

请注意,如果字符类出现在第一个或最后一个字符类中,则无需转义连字符。