2011-02-23 12 views
72

¿Cómo construir dos patrones de expresiones regulares en uno?Javascript Regexp generación dinámica a partir de variables?

Por ejemplo, tengo un patrón largo y uno más pequeño, necesito poner uno más pequeño que uno largo.

var pattern1 = ':\(|:=\(|:-\('; 
var pattern2 = ':\(|:=\(|:-\(|:\(|:=\(|:-\(' 
str.match('/'+pattern1+'|'+pattern2+'/gi'); 

Esto no funciona. Cuando estoy concatenando cadenas, todas las barras se han ido.

Respuesta

130

usted tiene que utilizar RegExp:

str.match(new RegExp(pattern1+'|'+pattern2, 'gi')); 

Cuando estoy concatenación de cadenas, todas las barras se han ido.

Si usted tiene una barra invertida en su patrón de escapar de un personaje de expresiones regulares especiales, (como \(), usted tiene que utilizar dos barras invertidas en la cadena (porque \ es el carácter de escape en una cadena): new RegExp('\\(') Sería lo mismo que /\(/.

Así que sus patrones tienen que llegar a ser:

var pattern1 = ':\\(|:=\\(|:-\\('; 
var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\('; 
12

Utilice el siguiente:

var regEx = new RegExp(pattern1+'|'+pattern2, 'gi'); 

str.match(regEx); 
+5

¿No debería el ' '/'' ser eliminado cuando se utiliza 'new RegExp (...)'? –

+0

@BartKiers ¡buen punto! Error común ! x) Merece la pena agregar un gran aviso en algún lugar :) –

6

usted tiene que renunciar a la expresión regular literal y utilizar el constructor de objetos, donde se puede pasar a la expresión regular como cuerda.

var regex = new RegExp(pattern1+'|'+pattern2, 'gi'); 
str.match(regex); 
1

El constructor RegExp crea un objeto de expresión regular para hacer coincidir texto con un patrón.

var pattern1 = ':\\(|:=\\(|:-\\('; 
    var pattern2 = ':\\(|:=\\(|:-\\(|:\\(|:=\\(|:-\\('; 
    var regex = new RegExp(pattern1 + '|' + pattern2, 'gi'); 
    str.match(regex); 

Por encima de código funciona perfectamente para mí ...

Cuestiones relacionadas