Я пытаюсь взять цифру (5
), за которой следует возможно -
или (пробел), продолжая последовательность из 3 цифр, а затем, наконец, на одну цифру. Если первая группа не совпадает вообще, то только возвращают другие последовательности цифр.
^(5\-? ?)?(\d{3})(\d)$
Это выглядит правильно для меня и не вызывает никаких ошибок, но это дает 5
назад:
"5489" -> ()("548")("9")
Там, где я бы не хотел, чтобы это выражение возвращало совпадение для этого шаблона.
Поэтому быстрый поиск привел меня к притяжательным выражениям и множеству статей о вашем бывшем. Из того, что я читаю, похоже, что он должен работать:
^(5\-? ?)?+(\d{3})(\d)$
Но Javascript не нравится это как регулярное выражение.
Есть ли способ сделать жадную притяжательную группу захвата в Javascript или имитировать ее в этой ситуации?
Если вы посмотрите документы ECMAScript 5, вы увидите, что нет никакой поддержки для притяжательных квантификаторов.
Вы можете использовать
^(?!5\d{3}$)(5-? ?)?(\d{3})(\d)$
См. Демо-версию regex. Отрицательный lookahead (?!5\d{3}$)
даст совпадения сразу, если строка начинается с 5
а затем имеет 3 цифры.
Детали:
^
- начало строки(?!5\d{3}$)
- не может быть 5
а затем 3 цифры и конец строки сразу справа от текущего местоположения(5-??)?
- необязательная последовательность из 5
, затем необязательная -
и затем дополнительное пространство(\d{3})
- 3 цифры(\d)
- одна цифра$
- конец строки.Вы можете имитировать функциональные свойства квантификатора, используя превосходные качества:
^(?=(...))\1
Regex:
^(?=((5\-? ?)?))\1(\d{3})(\d)$
55890
первых, что он имитирует притяжательных, два, что он не будет соответствовать 5890
но будет соответствовать 55890
.
?+