(?:\d+)?
- это то же самое, что и \d*
, а (?:\.)?
может быть просто \.?
. Упрощенно, ваше оригинальное регулярное выражение:
price:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?
У вас есть два варианта. Вы можете либо сделать price([:;]range)*
, где range - это регулярное выражение, которое вы используете для сопоставления диапазонов номеров, либо быть более точным в отношении пунктуации, но вам придется дважды выписать range и сделать price:range(;range)*
.
price([:;]range)* -- shorter but allows first ':' to be ';'
price:range(;range)* -- longer but gets colon vs semi-colon correct
Выберите одно из этих двух регулярных выражений:
price[:;](?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?
price:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?(?:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?)*