2011-06-09 11 views
8

Genel bir regex gerçekleştirmek için bir dize kullanmak istiyorum, ancak içinde normal ifade karakterleri olabilir. Onunla regex oluşturmadan önce bir dizede tüm regex karakterleri kaçmanın en iyi yolu nedir?RegExp oluşturulmadan önce regex karakter dizisini Sanitise?

Temelde böyle bir şey olabilir;

var test = 'test.'; 
var regex = new RegExp(test, 'ig'); 

'Test' gerekiyor. 'test' olmak için. bu yüzden beklenmedik şekillerde davranmaz.

test = test.replace(/[\\\.\+\*\?\^\$\[\]\(\)\{\}\/\'\#\:\!\=\|]/ig, "\\$&"); 
+0

Birkaç ay önce sorduğum bir soruya benzer! Gerçekten hiç bir cevap aldım bu yüzden belki öğrenirsin ... http://stackoverflow.com/questions/3614440/replicate-the-functionality-of-javas-pattern-quote-in-a-javascript-regexp – MatrixFrog

cevap

9
new RegExp(test.replace(/[#-.]|[[-^]|[?|{}]/g, '\\$&')); 

veya basitçe: Bu onların kaçtı sürümü ile tüm özel RegExp karakterleri yerini alacak

+0

tüm tekrarlarını (ben yayınınızı düzenlemeyi çalıştı, ama söyler yerine,/g küresel bayrağını unuttum Ben ikincisine (regex nedense olması gerektiği bazı şeyleri maç olmaz) ile bazı sorunlar vardı :) – youurayy

+0

@ypocat olması gerektiğini! –

+0

danke ama birincisi inşaat büyük - beni değişiklik en az 6 karakter) –

3

new RegExp(test.replace(/[#-}]/g, '\\$&')); 

ikincisi olması gerektiği çok daha fazla kaçan sona erecek, ancak hiçbir şeye zarar vermez.

+0

Ancak bazı gerçi Bu karakterlerin sadece belirli bağlamlarda özel, değil mi? Bu sorun yaratır mı? – MatrixFrog

+0

Karakterden kaçan diğer bağlamlarda RegExp eşleme dizgisine zarar vermez, gereksiz hale gelir. – mVChr

+1

'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' no '' no escape need no no no no no Ayrıca, '' '' ve 'ye ihtiyacınız vardır ve içinde bulunduğunuz bağlamda bu karakterlerin çoğundan kaçmanıza gerek yoktur. Basitçe'/[- \\., _ * +?^$ [Olabilir. \]() {}! = |]/' –