Vorausgesetzt, dass:
- Sie wissen, was Sie in Ihrem regulären Ausdruck tun.
- Sie haben viele Regex-Teile, um ein Muster zu bilden, und sie verwenden dieselbe Flagge.
- Sie finden es besser lesbar, Ihre kleinen Musterblöcke in ein Array zu unterteilen.
- Sie möchten auch in der Lage sein, jeden Teil für den nächsten Entwickler oder sich selbst später zu kommentieren.
- Sie bevorzugen es, Ihren regulären Ausdruck visuell zu vereinfachen,
/this/ganstatt new RegExp('this', 'g');
- Es ist in Ordnung, wenn Sie den Regex in einem zusätzlichen Schritt zusammenbauen, anstatt ihn 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');
Sie können 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 (einem Code-Spiegel-ähnlichen Editor) ist es viel einfacher, einen großen regulären Ausdruck auszuführen, als viele Ersetzungen wie die folgenden, da jedes Mal, wenn ich ein Ausdruck durch ein HTML-Tag ersetze, das nächste Muster verwendet wird Es ist schwieriger zu zielen, ohne das HTML-Tag selbst zu beeinflussen (und ohne das gute Aussehen , das in Javascript leider nicht 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>')
let regexSegment1 = String.raw`\s*hello\s*`