Şartıyla:
- normal ifadenizde ne yaptığınızı biliyorsunuz;
- bir desen oluşturmak için birçok regex parçanız var ve bunlar aynı bayrağı kullanacak;
- küçük desen parçalarınızı bir diziye ayırmanın daha okunabilir olduğunu görürsünüz;
- ayrıca bir sonraki geliştirici veya daha sonra kendiniz için her bir parçayı yorumlamak istersiniz;
- regex'inizi görsel olarak basitleştirmek
/this/g
yerine new RegExp('this', 'g')
;
- regex'i en başından itibaren tek bir parçaya eklemek yerine ekstra bir adımda birleştirmeniz uygundur;
O zaman bu şekilde yazmak isteyebilirsiniz:
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');
daha sonra şöyle bir şey yapabilirsiniz:
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>';
})
Benim özel durumumda (kod ayna benzeri bir editör), bir ifadeyi sarmak için her bir html etiketi ile değiştirdiğimde aşağıdaki gibi birçok yerine büyük bir regex gerçekleştirmek çok daha kolay, bir sonraki desen html etiketinin kendisini etkilemeden (ve maalesef javascript'te desteklenmeyen iyi bir görünüm olmadan) hedeflemek daha zor olabilir :
.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*`