2015-05-07 43 views
9

Kodum bir RegExp nesnesi (kontrolümün dışında) alır. Küresel değil ama buna ihtiyacım var. Şu anda Varolan bir RegExp'deki bayrakları değiştirmek mümkün mü?

Bunu yapmamın:

if (!regex.global) { 
    var flags = 'g'; 
    if (regex.ignoreCase) flags += 'i'; 
    if (regex.multiline) flags += 'm'; 
    if (regex.sticky ) flags += 'y'; 
    regex = new RegExp(regex.source, flags); 
} 

... Başka bir yol anlamaya olamaz çünkü.

  • regex.global no setter.
  • regex.compile(new_pattern)new RegExp(new_pattern)
  • regex.flags lehine önerilmemektedir bir şey

Bunu yapmak için daha iyi bir yolu var mı değil mi?

+4

bir regex iç yapısı böyle bir ayarlayıcı IMO pahalıya mal olacağını bunun (global regex Yineleyicinin) global veya değil olmadığına, örneğin, bağlı olduğu göz önüne alındığında (ve ne gerekir Bu durumu sıfırlayın?). Çözümün muhtemelen en iyisi. –

+0

Bunu riske edip soruyorum - neden küresel olmak için ona ihtiyacınız var? –

+1

@dystroy: Aslında bana sadece gelecek bir böcek kurtardınız. Yani, regex global ise o zaman, regex.lastIndex değerini 0 olarak değiştirmeyi hatırlamalıyım. Anlayabildiğim kadarıyla, g olmayan bir regex için durum ve yapışkanın uygulanmadığı durum (çoğunlukla hala durum) var -> örneğin: 'var r =/a /; var s = "ababa"; r.exec (s); r.exec (s); // r.lastIndex her zaman 0 ' –

cevap

2

Korkarım cevap "Hayır".

Varolan bir normal ifadedeki bayrakları değiştirmenin bir yolu yoktur. Yaptığın şey en temiz yol gibi görünüyor.

Sen (tartışmalı) İsteğe bağlı bayrakları biraz kısaltmak olabilir:

var flags = 'g' + 
    (regex.ignoreCase ? 'i' : '') + 
    (regex.multiline ? 'm' : '') + 
    (regex.sticky ? 'y' : ''); 
0

Eğer modifiye bayrakları ile yeni bir tane oluşturun varolan RegExp bayraklarını değiştiremezsiniz bile. Bir güzel bir seçenek YourJS.flagRegExp() kullanıyor:

rgx1 = /[A-Z]/g; 

rgx2 = YourJS.flagRegExp(rgx1, 'i'); 
// > /[A-Z]/gi 

rgx3 = YourJS.flagRegExp(rgx1, '!i!g'); 
// > /[A-Z]/i 

API belgeleri here bulunmuştur. Kendi JS kitaplığınızı, projeniz için istediğiniz diğer işlevlerle özelleştirebilirsiniz.

2

Artık bunu ES6'da yapabilirsiniz. "Bu" ifadesiyle, varolan bir regexp'deki bayrakları değiştirmeyi değil, bayraklarını değiştiren veya değiştiren varolan bir ifadeden yeni bir regexp oluşturmak istemiyorum. Bkz http://www.2ality.com/2015/07/regexp-es6.html. Bu yayından Örnek:

function copyWithIgnoreCase(regex) { 
    return new RegExp(regex, regex.flags + 'i'); 
} 
İlgili konular