2015-07-17 2 views
1

У меня есть функция javascript, которая получает регулярное выражение как один из его аргументов. Я хотел бы убедиться, что RegExp имеет модификатор i (без учета регистра), а если нет, добавьте его.Обеспечение того, что данный регистр нечувствителен к регистру

var caseInsensitiveMatch = function (rx) { 
    // TODO: verify that rx has the i modifier. Add it if it doesn't 
    return rx.exec('mY tExT'); 
} 

// both should match: 
caseInsensitiveMatch(/my text/); 
caseInsensitiveMatch(/my text/i); 

Какой элегантный способ сделать это?

ответ

3

Если вы хотите сохранить все флаги и просто добавить прецедентную нечувствительность:

function caseInsensitiveMatch(rx, text) { 
    var flags = 'i'; 
    if (rx.multiline) flags += 'm'; 
    if (rx.global) flags += 'g'; 
    return (new RegExp(rx.source, flags)).test(text); 
} 
+0

Спасибо, я не был знаком с исходным свойством RegExp. –

2

Вы можете использовать regex.source собственности и построить новый RegExp, добавив i флаг, чтобы сделать его игнорировать случай:

var caseInsensitiveMatch = function (rx) { 
    var flags = rx.toString().replace(/.*\//, "").replace("i", "") + "i"; 
    return (new RegExp(rx.source, flags)).test('mY tExT'); 
} 

caseInsensitiveMatch(/my text/); 
//=> true 
caseInsensitiveMatch(/my text/i); 
//=> true 
caseInsensitiveMatch(/MY TEXT/mig); 
//=> true 
caseInsensitiveMatch(new RegExp("MY TEXT", "mgi")); 
//=> true 
caseInsensitiveMatch(new RegExp("MY TEXT", "mg")); 
//=> true 
+1

Обратите внимание, что это приведет к удалению любых _other_ флагов, если вам это все равно. – Jacob

+0

Это хороший момент. Я отредактировал его сейчас. – anubhava

Смежные вопросы