2014-09-15 2 views
0

Я новичок в Regex..I написала следующее регулярное выражение для проверки номера телефонов в JavaScript: ^[0-9\+\-\s\(\)\[\]\x]*$Regex: Illegal последовательность шестнадцатеричного побег

Теперь я стараюсь то же самое в 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]*$ 

Пожалуйста проконсультировать.

+0

Не является ли '\ x' началом шестнадцатеричной escape-последовательности? Например, \ x0FF0. Посмотрите на регулярное выражение javascript, чтобы увидеть, что вы хотите, а не '\ x' – Squidly

+0

. Вот точный javascript: var contactNumberRegExp =/^ [0-9 \ + \ - \ s \\ (\\) \\ [\\ ] \ х] * $ /; – TimeToCodeTheRoad

+0

'\ x' - это начало байта' \ x0F' или около того. В java редко, потому что java использует unicode, '\ u000F' будет более регулярным. Является ли регулярное выражение символом «x»? Возможно, изначально было '\ x09' aka tab. Оставьте '\ x' вне. –

ответ

3

Поскольку вы пытаетесь сопоставить то, что я предполагаю, это x (как в расширении телефона), его нужно экранировать с четырьмя обратными косыми чертами или вообще не сбежать; в противном случае \x интерпретируется как шестнадцатеричный код возврата. Поскольку \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]*$"; 
+1

+1, но нет необходимости скрывать '+()' и '-' в первой или последней позиции. – Toto

+0

Вы совершенно верны; '+()', похоже, работает в любой позиции. –

0

Вы Waaaay слишком много обратной косой черты!

Во-первых, чтобы кодировать буквальную обратную косую черту в java, вы должны написать два из них.

Во-вторых, большинство символов теряют свое специальное значение регулярного выражения, когда в классе символов.

В-третьих, \x вводит шестнадцатеричный литерал - вы этого не хотите.

Написать регулярное выражение как это:

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

Обратите внимание, как вам не нужно, чтобы избежать дефис в классе символов, когда он появляется первым или последним.

Смежные вопросы