Vorausgesetzt, dass:
- Sie wissen, was Sie in Ihrer Regexp tun;
- Sie haben viele Regex-Teile, um ein Muster zu bilden, und sie verwenden dasselbe Flag;
- Sie finden es übersichtlicher, wenn Sie Ihre kleinen Musterbausteine in ein Array aufteilen;
- Sie wollen auch in der Lage sein, jeden Teil für den nächsten Entwickler oder für sich selbst später zu kommentieren;
- Sie es vorziehen, Ihre Regex visuell zu vereinfachen wie
/this/g
statt new RegExp('this', 'g')
;
- ist es in Ordnung, wenn Sie die Regex in einem zusätzlichen Schritt zusammensetzen, anstatt sie von Anfang an in einem Stück zu haben;
Dann möchten Sie vielleicht so schreiben:
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');
können Sie dann etwas tun wie:
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>';
})
In meinem speziellen Fall (ein Code-Spiegel-ähnlicher Editor) ist es viel einfacher, eine große Regex auszuführen, als eine Menge Ersetzungen wie die folgenden, da jedes Mal, wenn ich mit einem html-Tag ersetzen, um einen Ausdruck zu umschließen, das nächste Muster schwieriger zu zielen, ohne das html-Tag selbst zu beeinflussen (und ohne die gute zurückblicken die leider nicht in Javascript unterstützt wird):
.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>')
3 Stimmen
Es ist einfacher, mit escapeten Regex-Zeichen umzugehen, wenn Sie String.raw() verwenden:
let regexSegment1 = String.raw`\s*hello\s*`