58 votos

¿Cómo puedo concatenar expresiones literales en Javascript?

Es posible hacer algo como esto?

var pattern = /some regex segment/ + /* comment here */
    /another segment/;

O tengo que utilizar las nuevas RegExp() de la sintaxis y concatenar una cadena? Prefiero utilizar el literal como el código es tanto más evidente y concisa.

92voto

Jerub Puntos 17488

Aquí es cómo crear una expresión regular sin el uso de la expresión regular sintaxis literal. Esto le permite hacer cualquier código de manipulación de cadena antes de que se convierte en un objeto de expresión regular:

var segment_part = "some bit of the regexp";
var pattern = new RegExp("some regex segment" + /*comment here */
              segment_part + /* that was defined just now */
              "another segment");

Si usted tiene dos expresiones regulares literales, de hecho pueden concatenar usando esta técnica:

var expression_one = /foo/;
var expression_two = /bar/;
var expression_three = new RegExp(expression_one.source + expression_two.source);

No es del todo una buena solución, como bajar las banderas que se establezca en expression_one y expression_two, y es más prolijo que tener simplemente la expresión de uno y dos cadenas literales en lugar de literal de las expresiones regulares.

6voto

Alex Puntos 41

No estoy completamente de acuerdo con el "eval" opción.

var xxx = /abcd/;
var yyy = /efgh/;
var zzz = new RegExp(eval(xxx)+eval(yyy));

le dará "//abcd//efgh//" que no es el resultado deseado.

El uso de la fuente como

var zzz = new RegExp(xxx.source+yyy.source);

le dará "/abcdefgh/" y que es correcta.

Logicaly no hay necesidad de EVALUAR, usted sabe que su EXPRESIÓN. Usted necesidad justa de su ORIGEN o de lo que está escrito no necessarely su valor. Como las banderas, usted sólo tiene que utilizar el argumento opcional de RegExp.

En mi situación, yo no se ejecutan en el tema de la ^ y $ siendo utilizado en varios expresión estoy tratando de concatenar juntos! Esas expresiones son de gramática de los filtros que se utilizan en el programa. Ahora yo wan't para utilizar algunas de ellas en conjunto para manejar el caso de las PREPOSICIONES. Voy a tener que "rebanada" las fuentes para quitar el inicio y final de ^( y/o )$ :) Saludos, Alex.

6voto

Japheth Salva Puntos 18

Sólo al azar concatenación de expresiones regulares objetos pueden tener algunos efectos secundarios adversos. El uso de la RegExp.fuente en su lugar:

var r1 = /abc/g;
var r2 = /def/;
var r3 = new RegExp(r1.source + r2.source, 
                   (r1.global ? 'g' : '') 
                   + (r1.ignoreCase ? 'i' : '') + 
                   (r1.multiline ? 'm' : ''));
var m = 'test that abcdef and abcdef has a match?'.match(r3);
// m should contain 2 matches

Esto también le dará la capacidad para retener la expresión regular las banderas de un anterior RegExp utilizando el estándar de RegExp banderas.

jsFiddle

1voto

roenving Puntos 1194

Usted tendrá que utilizar las nuevas RegExp !-)

0voto

Aupajo Puntos 2387

No, el sentido literal no es compatible. Tendrás que utilizar RegExp.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X