Как сделать часть шаблона обязательной, если присутствует определенный символ - PullRequest
0 голосов
/ 09 февраля 2019

На самом деле у меня есть этот шаблон:

([0-9]{1,3}\.)?[0-9]{1,3},*?[0-9]{0,2}$

, который делает то, что мне нужно, позволяет пользователям вводить: 1.234,56 / 1234,56 / 123,56 / 1, но проблема в том, что он позволяет 1.000(тысяча с разделителем точек - мне это не нужно), есть ли способ сделать запятую обязательной, если хотя бы одна точка присутствует?

Пожалуйста, никаких решений javascript.

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Последняя часть вашего шаблона ,*?[0-9]{0,2} соответствует 0+ раз запятой, за которой следуют 0-2 цифры, что, например, делает общее совпадение действительным для 1.1,,,.

Что вы также можете сделать этоиспользуйте чередование , чтобы сопоставить либо вариант, который содержит точку и запятую, либо | для совпадения с одной или несколькими цифрами, за которыми следует дополнительная часть, которая соответствует запятой и 1-2 цифрами.

^(?:[0-9]{1,3}\.[0-9]{1,3},[0-9]{1,2}|[0-9]+(?:,[0-9]{2})?)$

Regex101 demo

Пояснение

  • ^ Начало строки
  • (?: Группа без захвата
    • [0-9]{1,3}\.[0-9]{1,3},[0-9]{1,2} Сделать запятую необходимой, когда есть точка
    • | Или
    • [0-9]+(?:,[0-9]{2})? Совпадение 1+ цифр, за которыми следует дополнительная запятая и 1-2 цифры
  • ) Закрыть группу без захвата
  • $ Конец строки
0 голосов
/ 09 февраля 2019

Если ваше регулярное выражение привязано в начале (например, ^), вы можете использовать положительный прогноз для строки, которая либо содержит . и a ,, либо нетсодержит ., а затем соответствует существующему шаблону:

(?=.*\..*,|[^.]+$)([0-9]{1,3}?\.?)??([0-9]{1,3})(,[0-9]{0,2})?$

Демонстрация по регулярному выражению regex101

...