Pod warunkiem, że:
- wiesz, co robisz w swoim wyrażeniu regularnym;
- masz wiele elementów wyrażenia regularnego tworzących wzorzec i będą one używać tej samej flagi;
- bardziej czytelne jest rozdzielenie małych fragmentów wzoru na tablicę;
- chcesz także móc później skomentować każdą część dla następnego dewelopera lub siebie;
- wolisz wizualnie uprościć swoje wyrażenie regularne
/this/g
zamiast new RegExp('this', 'g')
;
- możesz złożyć wyrażenie regularne w dodatkowym kroku, zamiast mieć je w jednym kawałku od początku;
W takim razie możesz napisać w ten sposób:
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');
możesz wtedy zrobić coś takiego:
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>';
})
W moim konkretnym przypadku (edytor podobny do kodu lustrzanego) znacznie łatwiej jest wykonać jedno duże wyrażenie regularne niż wiele zastępstw, takich jak śledzenie, ponieważ za każdym razem, gdy zastępuję tag html, aby zawinąć wyrażenie, następny wzorzec będzie trudniej jest kierować reklamy bez wpływu na sam tag HTML (i bez dobrego lookbehind, którego niestety nie obsługuje 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*`