При условии что:
- вы знаете, что вы делаете в своем регулярном выражении;
- у вас есть много частей регулярных выражений для формирования шаблона, и они будут использовать один и тот же флаг;
- Вы находите более читабельным разделение своих маленьких кусочков шаблона в массив;
- Вы также хотите иметь возможность комментировать каждую часть для следующего разработчика или себя позже;
- вы предпочитаете визуально упростить свое регулярное выражение,
/this/g
а не new RegExp('this', 'g')
;
- это нормально для вас, чтобы собрать регулярное выражение в дополнительном шаге, а не в одном месте с самого начала;
Тогда вы можете написать так:
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');
тогда вы можете сделать что-то вроде:
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>';
})
В моем конкретном случае (редактор с зеркальным отображением кода) гораздо проще выполнить одно большое регулярное выражение, чем много замен, например, следующих, поскольку каждый раз, когда я заменяю тег html для переноса выражения, следующий шаблон будет быть более трудным для цели, не затрагивая сам тег html (и без хорошего внешнего вида, который, к сожалению, не поддерживается в 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*`