2011-05-19 9 views
6

tengo este pedazo de código VBNet que me gustaría traducir en javascript:errores de traducción de expresiones regulares de .NET para Javascript

Dim phone_check_pattern = "^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$" 
    System.Diagnostics.Debug.WriteLine(System.Text.RegularExpressions.Regex.IsMatch("test input", phone_check_pattern)) 

mi resultado traducida:

var phone_check_pattern = "^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$"; 
alert(new RegExp(phone_check_pattern).test("test input")) 

Sin embargo, cuando lo funciono tiene error Uncaught SyntaxError: Invalid regular expression:: Nothing to repeat

(mi código VbNet no tiene ningún error, aunque)

¿Alguien sabe qué está causando el problema?

+0

@Pacerier ¿Puede decirnos qué se supone que debe hacer el regEx? – sra

+1

@sra: Está asumiendo la tarea formidable (algunos incluso dirían quijotesca) de validar un número de teléfono ingresado en un campo libre. No es para los débiles de corazón, y es propenso a todo tipo de problemas. –

+1

@sra se indica en la pregunta, dentro del código – Pacerier

Respuesta

7

El carácter de barra diagonal inversa en cadenas de JavaScript es un carácter de escape, por lo que las barras diagonales inversas que tiene en la cadena escapan al siguiente carácter para la cadena, no para la expresión regular. Así que justo al principio, en su "^(\+?, la barra invertida simplemente escapa al +para la cadena (que no necesita), y lo que ve la expresión regular es solo un + crudo sin nada que repetir. De ahí el error.

Afortunadamente, JavaScript tiene una sintaxis literal de las expresiones regulares (delimitado con / caracteres), lo que probablemente sería un mejor punto de partida para usted:

var re = /^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.\/-]|\([ 0-9.\/-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.\/-]|\([ 0-9.\/-]+\)))?$/; 
alert(re.test("test input")); 

Entonces, al menos las barras invertidas están escapando en la expresión regular, no la cadena. (Tenga en cuenta que, dado que / es el delimitador para el literal de expresión regular, tenemos que escapar de ella (con una barra invertida).)

no han revisado de manera exhaustiva la expresión regular real, pero que debería empezar.

Más sobre los literales de expresiones regulares en the spec, por supuesto, y here on MDC.

2

No estoy seguro pero trato de usar \\ en lugar de \ en su código javascript. Visto algunas muestras que hicieron esto.

1

La doble barra, como todos dijeron, es importante. Esto funciona:

var phone_check_pattern = "^(\\+?|(\\(\\+?[0-9]{1,3}\\))|)"+ 
    "([ 0-9.//-]|\\([ 0-9.//-]+\\))+"+ 
    "((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\\([ 0-9.//-]+\\)))?$"; 

var re = new RegExp(phone_check_pattern); 
say(re.test("test input")); 
say(re.test("(415) 828-3321")); 
say(re.test("+1 (212) 828-3321")); 
say(re.test("da828-3321")); 
Cuestiones relacionadas