¿Es posible hacer algo como esto?
var pattern = /some regex segment/ + /* comment here */
/another segment/;
¿O tengo que usar una nueva RegExp()
sintaxis y concatenar una cadena? Prefiero usar el literal ya que el código es más evidente y conciso.
javascript
regex
syntax
párpado
fuente
fuente
let regexSegment1 = String.raw`\s*hello\s*`
Respuestas:
Aquí se explica cómo crear una expresión regular sin usar la sintaxis literal de la expresión regular. Esto le permite realizar una manipulación arbitraria de cadenas antes de que se convierta en un objeto de expresión regular:
Si tiene dos literales de expresión regular, de hecho puede concatenarlos utilizando esta técnica:
Es simplemente más prolijo que simplemente tener la expresión uno y dos como cadenas literales en lugar de expresiones regulares literales.
fuente
new RegExp(/(/.source + /.*/.source + /)?/.source);
no parece funcionar.expression_one
? Qué quiere decirregex1
?Solo concatenar aleatoriamente objetos de expresiones regulares puede tener algunos efectos secundarios adversos. Utilice RegExp.source en su lugar:
Esto también le dará la capacidad de retener los indicadores de expresión regular de un RegExp anterior utilizando los indicadores RegExp estándar.
jsFiddle
fuente
RegExp.prototype.flags
No estoy del todo de acuerdo con la opción "eval".
dará "// abcd // efgh //", que no es el resultado deseado.
Usando fuente como
dará "/ abcdefgh /" y eso es correcto.
Lógicamente no hay necesidad de EVALUAR, ya sabes tu EXPRESIÓN. Solo necesita su FUENTE o cómo está escrito, no necesariamente su valor. En cuanto a las banderas, solo necesita usar el argumento opcional de RegExp.
En mi situación, corro el problema de que ^ y $ se usan en varias expresiones ¡Estoy tratando de concatenar juntos! Esas expresiones son filtros gramaticales utilizados en todo el programa. Ahora quiero usar algunos de ellos juntos para manejar el caso de PREPOSICIONES. Puede que tenga que "cortar" las fuentes para eliminar el principio y el final ^ (y / o) $ :) Saludos, Alex.
fuente
var regex = "\.\..*"
Problema Si el regexp contiene grupos de correspondencia inversa como \ 1.
Entonces simplemente contactando las fuentes no funcionará. De hecho, la combinación de los dos es:
La solución: primero contamos el número de grupos coincidentes en la primera expresión regular, luego para cada ficha de coincidencia inversa en el segundo, lo incrementamos por el número de grupos coincidentes.
Prueba:
fuente
function concatenateList() { var res = arguments[0]; for(var i = 1; i < arguments.length; i++) { res = concatenate(res, arguments[i]); } return res; }
Sería preferible utilizar la sintaxis literal tan a menudo como sea posible. Es más corto, más legible, y no necesita comillas de escape o contragolpes de doble escape. De "Patrones Javascript", Stoyan Stefanov 2010.
Pero usar New puede ser la única forma de concatenar.
Yo evitaría eval. No es seguro.
fuente
Siempre que:
/this/g
lugar denew RegExp('this', 'g')
;Entonces te gustaría escribir de esta manera:
entonces puedes hacer algo como:
En mi caso particular (un editor similar al código espejo), es mucho más fácil realizar una gran expresión regular, en lugar de muchos reemplazos como el siguiente, ya que cada vez que reemplazo con una etiqueta html para ajustar una expresión, el siguiente patrón será ser más difícil de apuntar sin afectar la etiqueta html en sí (y sin el buen aspecto que desafortunadamente no es compatible con javascript):
fuente
Podrías hacer algo como:
Los segmentos serían cadenas (en lugar de literales regex) pasadas como argumentos separados.
fuente
No, la forma literal no es compatible. Tendrás que usar RegExp.
fuente
Utilice el constructor con 2 parámetros y evite el problema con el final '/':
fuente
Puede concat fuente de expresiones regulares tanto de la clase literal como de la clase RegExp:
fuente
la forma más fácil para mí sería concatenar las fuentes, ej .:
el valor c dará como resultado:
fuente
Prefiero usar
eval('your expression')
porque no agrega el/
en cada extremo/
que lo='new RegExp'
hace.fuente