Регулярное выражение PHP для любых цифр, за которыми следуют определенные символы

#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)?$
 

Демонстрация регулярных выражений 3