Regex - повторяющиеся совпадения - PullRequest
0 голосов
/ 06 февраля 2010

Другой вопрос регулярного выражения

У меня есть такой текст:

test start first end start second end start third end

и мне нужны такие совпадения:

test first
test second 
test third

Я пробовал что-то подобное:

start(.*?)end

а как добавить "тест"?

Спасибо за любые предложения

Lennyd

(отредактировано - во входном тексте была ошибка)


Нет возможности использовать другой язык программирования, это должно быть просто регулярное выражение. Мне это нужно для синтаксического анализа веб-страницы с (частично) синтаксисом:

Season 1
    Episode 1
    Episode 2
    Episode 3
Season 2
    Episode 1
    Episode 2
...etc

и с этим регулярным выражением мне нужно выводить как


<episodeslist>>
  <episode season="1" episode="1">
  <episode season="1" episode="2">
.. etc

.. детализировано - это для xmbc.org media scraper

Ответы [ 2 ]

1 голос
/ 07 февраля 2010

Я единственный, кто не понял, чего хочет Леннид в первом примере?

Теперь для этого

ввод

Season 1
  Episode 1
  Episode 2
  Episode 3

выход

<episodeslist>
  <episode season="1" episode="1">
  <episode season="1" episode="2">

при условии, что вы используете многострочный инструмент регулярных выражений

задвижка
/Season[^0-9]*([0-9]+)[^\n]*[\s]+Episode[^0-9]*([0-9]+)\n/gs
добавьте столько [\s]+Episode[^0-9]*([0-9]+)\n, сколько нужно

возврат

<list>
<episode season=$1 episode=$2>
<episode season=$1 episode=$3>
<episode season=$1 episode=$4>
<episode season=$1 episode=$5>

просто не уверен насчет [^ \ n], используйте [^ E], если ввод действительно чистый

Если количество эпизодов варьируется от 24 до 26, просто запустите 3 регулярное выражение

Если вам нужно что-то более гибкое, вам понадобится мощное приложение, такое как GREP для Linux, или несколько клонов с пользовательским интерфейсом для других ОС, которые могут выполнять «regex inside regex»

Если на некотором скриптовом языке выполняются функции регулярных выражений, вы можете легко обернуть следующее в цикл, пока input больше не будет совпадать с чем-либо
{

1 - Match only `Season[^0-9]*([0-9]+)`, strip if off the input, store the season # in a variable,  
2 - Match a block of episodes `([\s]+Episode[^0-9]*[0-9]+\n)+`  
3 - Then inside that block match single lines `[\s]+Episode[^0-9]*[0-9]+`  
4 - Using the season variable, output the appropriate XML  

}

0 голосов
/ 07 февраля 2010

Очень примитивное регулярное выражение будет:

echo "test start first end start second end test third end" |
     perl -ne 'print "$1 -> $2\n" while (/(\w+).*?(\w+) end/g);'
test -> first
start -> second
test -> third

, но я согласен с Аланом Муром , что вы сэмплируете немного сшитые.

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