/ / Regex pattern match за извличане на време от низ в Javascript, който дава неочаквани резултати - javascript, regex

Regex модел съвпадат, за да извлечете време от низ в Javascript дават неочаквани резултати - javascript, regex

Опитвам се да съпоставя възможните начини за представяне на времето. Опитвам се да съвпадна с X, XX, XX: XX, X am, X pm, XXXX hr и т.н., където X е възможно число, което може да представлява времето.

timereg = /([0-1][0-9]|2[0-3]|[1-9])[:s]*([0-5][0-9])?[s]*(am|pm|hrs|hr)?/gi

Опитах следните примерни низове за съвпадение на регулярни изрази и имам изхода, който виждам в chrome console под всяко изпитание.

match = timereg.exec("Pick up at 5pm")
["5pm", "5", undefined, "pm"]

match = timereg.exec("Pick up at 5:30")
["5:30", "5", "30", undefined]

match = timereg.exec("Pick up kids at 5")
null

match = timereg.exec("Pick up kids at 15")
["15", "15", undefined, undefined]

match = timereg.exec("Pick up kids at 05")
["05", "05", undefined, undefined]

match = timereg.exec("Pick up kids at 20")
null

match = timereg.exec("Pick up kids at 21")
["21", "21", undefined, undefined]

match = timereg.exec("Pick up kids at 22")
null

match = timereg.exec("Pick up kids at 23")
["23", "23", undefined, undefined]

match = timereg.exec("Pick up kids at 1")
null

match = timereg.exec("Pick up kids at 2")
["2", "2", undefined, undefined]

match = timereg.exec("Pick up kids at 3")
null

match = timereg.exec("Pick up kids at 4")
["4", "4", undefined, undefined]

match = timereg.exec("Pick up kids at 5")
null

match = timereg.exec("Pick up kids at 6")
["6", "6", undefined, undefined]

Виждам съвпадение "21", "23", "2", "4", "6", докато "20", "22", "1", "3", "5" не. Не мога да разбера защо е така. Всяка помощ ще бъде високо оценена.

Отговори:

0 за отговор № 1

Това се дължи на използването на глобални g флаг във вашия регекс и повторете използването на същия регекс. Regex обектът помни lastIndex когато се използва с g флаг между множество exec или test метод обаждания.

Премахване g флаг и това ще бъде поправено.

Или иначе поставете този код за нулиране lastIndex собственост преди обаждане exec всеки път:

timereg.lastIndex = 0;
match = timereg.exec("Pick up kids at 20");