A condición de que:
- que sabe lo que hace en su expresión regular;
- tiene muchas piezas de expresiones regulares para formar un patrón y usarán la misma bandera;
- le resulta más legible para separar los trozos de pequeños patrones en una matriz;
- también desea poder comentar cada parte para el siguiente desarrollador o usted mismo más tarde;
- Prefiere simplificar visualmente su expresión regular como
/this/g
en lugar de new RegExp('this', 'g')
;
- está bien que ensamble la expresión regular en un paso adicional en lugar de tenerla en una pieza desde el principio;
entonces es posible que gustaría escribir de esta manera:
var regexParts =
[
/\b(\d+|null)\b/,// Some comments.
/\b(true|false)\b/,
/\b(new|getElementsBy(?:Tag|Class|)Name|arguments|getElementById|if|else|do|null|return|case|default|function|typeof|undefined|instanceof|this|document|window|while|for|switch|in|break|continue|length|var|(?:clear|set)(?:Timeout|Interval))(?=\W)/,
/(\$|jQuery)/,
/many more patterns/
],
regexString = regexParts.map(function(x){return x.source}).join('|'),
regexPattern = new RegExp(regexString, 'g');
a continuación, puede hacer algo como:
string.replace(regexPattern, function()
{
var m = arguments,
Class = '';
switch(true)
{
// Numbers and 'null'.
case (Boolean)(m[1]):
m = m[1];
Class = 'number';
break;
// True or False.
case (Boolean)(m[2]):
m = m[2];
Class = 'bool';
break;
// True or False.
case (Boolean)(m[3]):
m = m[3];
Class = 'keyword';
break;
// $ or 'jQuery'.
case (Boolean)(m[4]):
m = m[4];
Class = 'dollar';
break;
// More cases...
}
return '<span class="' + Class + '">' + m + '</span>';
})
En mi caso particular (un editor de código-espejo), es mucho más fácil realizar una gran expresión regular, en lugar de muchas sustituciones como seguir, ya que cada vez que reemplazo con una etiqueta html para envolver una expresión, el siguiente patrón será más difícil de orientar sin afectar la etiqueta html misma (y sin la bien de búsqueda hacia atrás que, lamentablemente, no es compatible con JavaScript):
.replace(/(\b\d+|null\b)/g, '<span class="number">$1</span>')
.replace(/(\btrue|false\b)/g, '<span class="bool">$1</span>')
.replace(/\b(new|getElementsBy(?:Tag|Class|)Name|arguments|getElementById|if|else|do|null|return|case|default|function|typeof|undefined|instanceof|this|document|window|while|for|switch|in|break|continue|var|(?:clear|set)(?:Timeout|Interval))(?=\W)/g, '<span class="keyword">$1</span>')
.replace(/\$/g, '<span class="dollar">$</span>')
.replace(/([\[\](){}.:;,+\-?=])/g, '<span class="ponctuation">$1</span>')
Siento que una insignia de oro está en camino - thx – danday74