Повторение групповых шаблонов в шаблоне регулярных выражений - PullRequest
2 голосов
/ 23 апреля 2009

Итак, ребята, у меня есть этот самодельный шаблон, который работает. Через несколько часов (я не гуру регулярных выражений) этот щенок эволюционировал, чтобы разобрать вывод curl PUT для меня:

   ^\s*([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)
    \s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)

(CR в тексте только для форматирования)

Это дает мне «группы», к которым я обращаюсь - это работает! Тем не менее, кодер во мне видит повторение паттерна, и это выводит меня из строя. За прошедшие годы я видел perl how-small-is-your-pattern конкурсы, которые заставляют меня думать, что это может быть намного меньше. Но мои попытки нанести удар * в это с треском провалились.

Итак, Вопрос в том, : как написать этот шаблон более кратким образом, чтобы я все еще мог вытащить свои целевые группы?

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

$1: percent finished
$2: size uploaded so far
$6: size to upload
$8: average upload rate 

Обновление: дополнительную информацию можно найти в моем блоге ( Как настроить OnMyCommand для создания индикатора выполнения для curl ), который объяснит, что я делаю и почему я после только регулярного выражения шаблон. Я на самом деле не пишу на языке, per se ... но я настраиваю инструмент для использования регулярных выражений.

Ответы [ 3 ]

3 голосов
/ 23 апреля 2009

Похоже, это лучшее, что я могу сделать:

^\s*([^ ]+)\s+([^ ]+)\s+(?:[^ ]+\s+){3}([^ ]+)\s+[^ ]+\s+([^ ]+)\s+

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

^\s*([^ ]+)\s+([^ ]+)\s+(?:[^ ]+\s+){3}([^ ]+)\s+[^ ]+\s+([^ ]+)(?:\s+[^ ]){4}

Обратите внимание, мои изменения также меняют номера захвата:

  • $ 1: процент завершен
  • $ 2: загруженный размер
  • $ 3: размер для загрузки
  • $ 4: средняя скорость загрузки

С этим можно обойтись, если он поддерживает \ S

^\s*(\S+)\s+(\S+)\s+(?:\S+\s+){3}(\S+)\s+\S+\s+(\S+)\s+

но это не значит точно то же самое.

0 голосов
/ 23 апреля 2009

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

^(\s*([^ ]+))+$

Объяснение:

  • ^ = начало строки
  • повторный образец = \ s * ([^] +)
  • заключите его в скобки и добавьте «+», чтобы указать «один или несколько совпадений предыдущих»
  • $ = конец строки
0 голосов
/ 23 апреля 2009
((^\s*|\s+)([^ ]+)){12}

Если вам не важно количество совпадений и вы хотите сопоставить полную строку, просто придерживайтесь следующего.

((^\s*|\s+)([^ ]+))*\s*$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...