Совпадение группы захвата или сбой совпадения, если отсутствует в регулярном выражении Javascript

1

Я пытаюсь взять цифру (5), за которой следует возможно - или (пробел), продолжая последовательность из 3 цифр, а затем, наконец, на одну цифру. Если первая группа не совпадает вообще, то только возвращают другие последовательности цифр.

^(5\-? ?)?(\d{3})(\d)$

Это выглядит правильно для меня и не вызывает никаких ошибок, но это дает 5 назад:

"5489" -> ()("548")("9")

Там, где я бы не хотел, чтобы это выражение возвращало совпадение для этого шаблона.

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

^(5\-? ?)?+(\d{3})(\d)$

Но Javascript не нравится это как регулярное выражение.

Есть ли способ сделать жадную притяжательную группу захвата в Javascript или имитировать ее в этой ситуации?

  • 1
    Нет ли собственнических количеств в JS ?+
  • 0
    @sin Син, если у вас есть авторитетная ссылка на это, пожалуйста, опубликуйте ее как ответ, я абсолютно согласен с этим. Обходные пути также приветствуются, если они существуют :)
Показать ещё 5 комментариев
Теги:
regex-greedy

2 ответа

1
Лучший ответ

Если вы посмотрите документы 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) - одна цифра
  • $ - конец строки.
3

Вы можете имитировать функциональные свойства квантификатора, используя превосходные качества:

^(?=(...))\1

Regex:

^(?=((5\-? ?)?))\1(\d{3})(\d)$

Демо-версия

  • 0
    +1 Я думаю, что это лучший ответ. 55890 первых, что он имитирует притяжательных, два, что он не будет соответствовать 5890 но будет соответствовать 55890 .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню