2016-03-12 7 views
0

Этот код Метеор не соответствует регулярному выражению для строки и создает true в условном выражении if. Что я делаю не так? как это исправить? Благодаряjavascript regex не соответствует заданной строке

console.log(doc.valid); 
 
console.log(doc.value); 
 
var patt = new RegExp(doc.valid); 
 
console.log(patt); 
 
    
 
if (patt.test(doc.value)) { 
 
    console.log("match"); 
 
} else { 
 
    console.log("no match"); 
 
}
//meteor terminal 
 

 
I20160313-08:06:53.143(11)? /[0-9a-zA-Z]{1,6}/g 
 
I20160313-08:06:53.144(11)? ok 
 
I20160313-08:06:53.144(11)? //[0-9a-zA-Z]{1,6}/g/ 
 
I20160313-08:06:53.145(11)? no match

отредактирован применяется исправление, как предложено в комментариях, но регулярное выражение соответствует строке, не предполагают, чтобы соответствовать.

var patt = new RegExp(doc.valid); 
 
console.log('applying '+ patt+ ' to '+ doc.value); 
 

 
if (patt.test(doc.value, "g")) { 
 
    console.log(doc.value + " match"); 
 

 
} else { 
 
    console.log(doc.value + "no match"); 
 

 
    } 
 

 
I20160313-08:48:26.717(11)? applying /[0-9a-zA-Z]{1,6}/ to Kingkong 
 
I20160313-08:48:26.717(11)? Kingkong match <..8 char.not suppose to match

+0

Если вы хотите совместить всю строку, будьте откровенны в ней с помощью маркеров начала и конца ('/^str $ /'). – MasterAM

ответ

1

Я думаю, ваша проблема заключается в том, что вы пытаетесь создать экземпляр объекта RegExp. Объект RegExp принимает в качестве первого аргумента строку, а не регулярное выражение. Попробуйте new RegExp("[0-9a-zA-Z]{1,6}","g")

+0

строка регулярного выражения находится в переменной, которая является единственным способом ее получения, поэтому я не могу использовать строковый литерал для регулярного выражения. –

+1

@Fred J. Если переменная 'doc.valid' уже является объектом регулярного выражения, вам не нужно создавать новый экземпляр. Просто выполните 'doc.valid.test (doc.value)'. Else разобрать строку и получить регулярное выражение и модификатор – jahnestacado

+0

@Fred J. Так как я не могу комментировать в отредактированном сообщении, я напишу здесь. Вы не делаете то, что я предлагал. Вам нужно указать модификатор при создании экземпляра RegExp, а не при вызове функции тестирования. Более того, результат, который вы получаете, верен, так как ваше регулярное выражение соответствует строке «Kingkong». Попробуйте '' Kingkong '.match (patt) '. Вы увидите, что вы получите матч. Поэтому, вероятно, вам нужно улучшить регулярное выражение, чтобы делать то, что вы ожидали – jahnestacado

2

Если вы хотите, чтобы ваше регулярное выражение означает «соответствие буквенно-цифровую строку со строго 1 до 6 букв (но не больше)», то оно должно быть:

/^[0-9a-zA-Z]{1,6}$/ 

оригинал:

/[0-9a-zA-Z]{1,6}/ 

означает «соответствует буквенно-цифровой строке, содержащей подстроку от 1 до 6 букв». Строка теста "Kingkong" явно соответствует этому правилу.

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