A condizione che:
- sai cosa fai nella tua regexp;
- hai molti pezzi regex per formare uno schema e useranno la stessa bandiera;
- lo trovi più leggibile per separare i piccoli blocchi di pattern in un array;
- vuoi anche essere in grado di commentare ogni parte per il prossimo sviluppatore o te stesso in seguito;
- preferisci semplificare visivamente il tuo regex come
/this/g
piuttosto che new RegExp('this', 'g')
;
- va bene per te assemblare il regex in un passaggio aggiuntivo anziché averlo in un pezzo dall'inizio;
Quindi potresti scrivere in questo modo:
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');
puoi quindi fare qualcosa del tipo:
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>';
})
Nel mio caso particolare (un editor di tipo mirroring del codice), è molto più semplice eseguire una grande regex, piuttosto che un sacco di sostituzioni come seguire come ogni volta che sostituisco con un tag html per avvolgere un'espressione, il modello successivo sarà essere più difficili da indirizzare senza influire sul tag html stesso (e senza il bello aspetto che purtroppo non è supportato in 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>')
let regexSegment1 = String.raw`\s*hello\s*`