#php #regex
Вопрос:
Я ищу, чтобы проверить строку, содержащую любое количество цифр, за которыми следует определенный символ, например:
«1 Вт 3d 5 ч 3 м» и «32d 5 ч 3 м»
В данный момент я использую следующее регулярное выражение: /d [wdhm]z/
но это не работает, если строка содержит букву, которая мне не нужна, например:
«3pp 2h 35 м» и «2d 5qq 3 м»
Единственными разрешенными буквами в строке могут быть «w», «d», «h» и «m», и они должны быть в таком порядке, если они присутствуют, например, «2d 35 м» допустимо, но «3 ч 1 Вт» не потому, что они в неправильном порядке.
Комментарии:
1. Попробуй
^(d w )?(d d )?(d h )?(d m)$
Ответ №1:
Вы можете использовать это регулярное выражение с несколькими необязательными совпадениями и указателем:
^(?=d)(?:d wh*)?(?:d dh*)?(?:d hh*)?(?:d m)?$
Демонстрация регулярных выражений
Сведения о регулярном выражении:
^
: Начало(?=d)
: Lookahead для подтверждения наличия цифры, запрещающей пустые совпадения(?:d wh*)?
: Сопоставьте 1 цифры, за которыми следуютw
и 0 пробелы.(?:d dh*)?
: Сопоставьте 1 цифры, за которыми следуютd
и 0 пробелы.(?:d hh*)?
: Сопоставьте 1 цифры, за которыми следуютh
и 0 пробелы.(?:d m)?
: Совпадение 1 цифр, за которыми следуетm
$
: Конец
Если вы не хотите разрешать нулевое расстояние между компонентами, используйте:
^(?=d)(?:d wh*)?(?:bd dh*)?(?:bd hh*)?(?:bd m)?$
Демонстрация регулярных выражений 2
Если вы хотите разрешить только один интервал, используйте:
^(?=d)(?:d wh)?(?:bd dh)?(?:bd hh)?(?:bd m)?$