Учитывая следующие два фрагмента кода 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?
После удаления всех необязательных частей '/^\ W * (Порт)? (\ D +) ((\/\ d +) +) \ W * $ /' становится '/ ^() (\ d +) ((\/\ d +) +) \ W * $/'. Теперь тривиально видеть, что это соответствует вашему вводу '' 1/2/"' ('\ W' соответствует последней косой чертой). –
Но тогда почему первый возвращает 'null'? does '\ W' не соответствует' 'X" '? – Halcyon
@FritsvanCampen Поскольку в шаблоне p2 есть X, не найден во входной строке? '\ W' ==' [^ a-zA-Z0-9_] ', поэтому X не соответствует' \ W'. –