Как продолжить матч в Regex - PullRequest
       2

Как продолжить матч в Regex

1 голос
/ 06 августа 2010
price:(?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?

Это регулярное выражение правильно соответствует следующим примерам.

price:1.00-342
price:.1-23
price:4
price:min-900.00
price:.10-.50
price:45-100
price:453.23-231231
price:min-max

Теперь я хочу улучшить его, чтобы соответствовать этим случаям.

price:4.45-8.00;10.45-14.50
price:1.00-max;3-12;23.34-12.19
price:1.00-2.50;min-12;23.34-max

В настоящее время матч заканчивается точкой с запятой. Как я могу заставить регулярное выражение повторяться через разделители точек с запятой?

Окончательное решение:

price:(((\d*\.)?\d+|min)-?((\d*\.)?\d+|max)?;?)+

Ответы [ 4 ]

1 голос
/ 06 августа 2010

(?:\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))?)*
1 голос
/ 06 августа 2010

Добавить опционально;в конце и сделайте весь шаблон таким, чтобы он совпадал с одним или несколькими:

1 голос
/ 06 августа 2010

Сначала возникают некоторые проблемы с вашим регулярным выражением: чтобы сопоставить xx.yyy вместо выражения (?:\d+)?(?:\.)?\d+, вы можете использовать это (?:\d*\.)?\d+.Это может совпадать только одним способом, чтобы избежать ненужного обратного отслеживания.

Также в настоящее время ваше регулярное выражение совпадает с такими вещами, как price:minmax и price:1.2.3, что, я полагаю, вы не хотите совпадать.Простой способ повторить совпадение - добавить точку с запятой, а затем повторить дословное выражение вашего регулярного выражения.

Вы можете сделать это следующим образом, чтобы не выписывать всю регулярную дважды:

price:(?:(?:(?:\d*\.)?\d+|min)(?:-(?:(?:\d*\.)?\d+|max))?(?:;|$))*

См. Это в действии на Рубуляр .

0 голосов
/ 06 августа 2010
price:((?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?;?)+

Я не уверен, что случилось со всеми? (Я знаю синтаксис, я просто не знаю, почему вы так часто его используете), но это должно сделать это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...