2013-10-04 7 views
0

Учитывая следующие два фрагмента кода javascript, я ожидаю, что и t1, и t2 будут оценены как false.javascript regexp не соответствует строке, как ожидалось

var p1 = /^\W*(Port)?(\d+)((X\d+)+)\W*$/ 
var t1 = p1.test("1X2X") 
var m1 = p1.exec("1X2X") // return null (as expected) 

var p2 = /^\W*(Port)?(\d+)((\/\d+)+)\W*$/ 
var t2 = p2.test("1/2/") 
var m2 = p2.exec("1/2/") // return ["1/2/", undefined, "1", "/2", "/2"] 

Но когда я запускаю код в Firefox (17,0), t1 оценивается в ложь (как и ожидалось), но t2 оценивается истина. Может ли кто-нибудь объяснить, почему t2 оценивается как true?

+0

После удаления всех необязательных частей '/^\ W * (Порт)? (\ D +) ((\/\ d +) +) \ W * $ /' становится '/ ^() (\ d +) ((\/\ d +) +) \ W * $/'. Теперь тривиально видеть, что это соответствует вашему вводу '' 1/2/"' ('\ W' соответствует последней косой чертой). –

+0

Но тогда почему первый возвращает 'null'? does '\ W' не соответствует' 'X" '? – Halcyon

+0

@FritsvanCampen Поскольку в шаблоне p2 есть X, не найден во входной строке? '\ W' ==' [^ a-zA-Z0-9_] ', поэтому X не соответствует' \ W'. –

ответ

0

\W матчи /, но не потому, что X\W является [^a-zA-Z0-9_]

0

Это где regex101.com отладчик может помочь вам: http://regex101.com/r/tK8cV1/#debugger

Вот скриншот выхода: http://imgur.com/e7AIfvX

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

Надеюсь, это поможет.

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