Tengo una expresión regular muy larga, que deseo dividir en varias líneas en mi código JavaScript para mantener cada longitud de línea 80 caracteres de acuerdo con las reglas de JSLint. Es mejor leer, creo. Aquí hay una muestra de patrón:
var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
javascript
regex
jslint
expression
readability
Nik Sumeiko
fuente
fuente
/\S+@\S+\.\S+/
?Respuestas:
Puede convertirlo en una cadena y crear la expresión llamando a
new RegExp()
:Notas:
RegExp
acepta modificadores como segundo parámetro/regex/g
=>new RegExp('regex', 'g')
[ Adición ES20xx (plantilla etiquetada)]
En ES20xx puede usar plantillas etiquetadas . Ver el fragmento.
Nota:
\s
,\s+
,\s{1,x}
,\t
,\n
etc).fuente
new RegExp
es una excelente forma de expresiones regulares multilínea. En lugar de unir matrices, puede usar un operador de concatenación de cadenas:var reg = new RegExp('^([a-' + 'z]+)$','i');
//
) y pegarlo como argumento de cadena en el constructor RegExp. Esto se debe a que los caracteres de barra diagonal inversa se consumen al evaluar el literal de cadena . Ejemplo:/Hey\sthere/
no se puede reemplazar pornew RegExp("Hey\sthere")
. En su lugar, debe reemplazarse pornew RegExp("Hey\\sthere")
Note la barra invertida adicional. Por lo tanto, prefiero dejar un literal regex largo en una línea largaRegExp
de una manera que es mucho más fácil de entender.Extendiendo la respuesta @KooiInc, puede evitar escapar manualmente de cada carácter especial utilizando la
source
propiedad delRegExp
objeto.Ejemplo:
o si desea evitar repetir la
.source
propiedad, puede hacerlo usando laArray.map()
función:En ES6, la función de mapa se puede reducir a:
.map(r => r.source)
fuente
combineRegex = (...regex) => new RegExp(regex.map(r => r.source).join(""))
Uso:combineRegex(/regex1/, /regex2/, ...)
Usar cadenas
new RegExp
es incómodo porque debes escapar de todas las barras invertidas. Puede escribir expresiones regulares más pequeñas y concatenarlas.Vamos a dividir esta expresión regular
Usaremos una función para hacer las cosas más bellas más tarde
Y ahora vamos a rockear
Como tiene un costo, intente construir la expresión regular real solo una vez y luego úsela.
fuente
multilineRegExp([/a|b/, /c|d])
resultados en/a|bc|d/
, mientras que quiso decir(a|b)(c|d)
.Aquí hay buenas respuestas, pero para completar, alguien debería mencionar la característica principal de herencia de Javascript con la cadena de prototipos . Algo como esto ilustra la idea:
fuente
Gracias al maravilloso mundo de los literales de plantilla , ahora puede escribir expresiones regulares grandes, de varias líneas, bien comentadas e incluso semánticamente anidadas en ES6.
Con esto, ahora puede escribir expresiones regulares como esta:
Salidas
¿O qué hay de multilínea?
Salidas
hel
, ordenadas!"¿Qué pasa si realmente necesito buscar una nueva línea?", Bueno, ¡entonces usa
\n
tonto!Trabajando en mi Firefox y Chrome.
De acuerdo, "¿qué tal algo un poco más complejo?"
Claro, aquí hay una pieza de un objeto que desestructura el analizador JS en el que estaba trabajando :
Sale
/^\s*((\})|(?:[,{]\s*)(?:(\.\.\.)|(\b\d+\b|\b[A-Za-z$_][\w$]*\b|("|')(?:(?!\5|\\).|(?:\\.))*\5)\s*(:|)|\s*(?={)))((?:\s*(?:[,}\]=]|$)|\s*\}|\s*[{[:]|\s*[,}{]).*)$/
¿Y ejecutarlo con una pequeña demostración?
Salidas exitosas
Tenga en cuenta la captura exitosa de la cadena citada.
Lo probé en Chrome y Firefox, ¡funciona genial!
Si tienes curiosidad, puedes ver lo que estaba haciendo y su demostración .
Aunque solo funciona en Chrome, porque Firefox no admite referencias o grupos con nombre. Entonces, tenga en cuenta que el ejemplo dado en esta respuesta es en realidad una versión neutralizada y puede ser engañado fácilmente para aceptar cadenas no válidas.
fuente
A la expresión regular anterior le faltan algunas barras negras que no funcionan correctamente. Entonces, edité la expresión regular. Considere esta expresión regular que funciona 99.99% para la validación de correo electrónico.
fuente
Para evitar la matriz
join
, también puede usar la siguiente sintaxis:fuente
Personalmente, optaría por una expresión regular menos complicada:
Claro, es menos preciso que su patrón actual, pero ¿qué está tratando de lograr? ¿Está tratando de detectar errores accidentales que pueden ingresar sus usuarios, o le preocupa que sus usuarios puedan intentar ingresar direcciones no válidas? Si es el primero, elegiría un patrón más fácil. Si es lo último, alguna verificación al responder a un correo electrónico enviado a esa dirección podría ser una mejor opción.
Sin embargo, si desea utilizar su patrón actual, sería (IMO) más fácil de leer (¡y mantener!) Construyéndolo a partir de subpatrones más pequeños, como este:
fuente
Simplemente puede usar la operación de cadena.
fuente
Intenté mejorar la respuesta de korun encapsulando todo e implementando soporte para dividir grupos de captura y conjuntos de caracteres, haciendo que este método sea mucho más versátil.
Para usar este fragmento, debe llamar a la función variadic
combineRegex
cuyos argumentos son los objetos de expresión regular que necesita combinar. Su implementación se puede encontrar en la parte inferior.Sin embargo, los grupos de captura no se pueden dividir directamente de esa manera, ya que dejaría algunas partes con solo un paréntesis. Su navegador fallará con una excepción.
En cambio, simplemente paso el contenido del grupo de captura dentro de una matriz. Los paréntesis se agregan automáticamente cuando se
combineRegex
encuentra con una matriz.Además, los cuantificadores necesitan seguir algo. Si por alguna razón la expresión regular necesita dividirse frente a un cuantificador, debe agregar un par de paréntesis. Estos serán eliminados automáticamente. El punto es que un grupo de captura vacío es bastante inútil y de esta manera los cuantificadores tienen algo a lo que referirse. Se puede usar el mismo método para cosas como grupos sin captura (se
/(?:abc)/
convierte[/()?:abc/]
).Esto se explica mejor con un ejemplo simple:
se convertiría:
Si debe dividir conjuntos de caracteres, puede usar objetos (
{"":[regex1, regex2, ...]}
) en lugar de matrices ([regex1, regex2, ...]
). El contenido de la clave puede ser cualquier cosa siempre que el objeto solo contenga una clave. Tenga en cuenta que, en lugar de hacerlo()
, debe usarlo]
como principio ficticio si el primer carácter puede interpretarse como cuantificador. Es decir, se/[+?]/
convierte{"":[/]+?/]}
Aquí está el fragmento y un ejemplo más completo:
fuente
La gran respuesta de @Hashbrown me llevó por el buen camino. Aquí está mi versión, también inspirada en este blog .
Úselo así:
Para crear este
RegExp
objeto:fuente