正则表达式 - 重复比赛

时间:2010-02-06 20:24:14

标签: regex

另一个正则表达式问题

我输入了这样的文字:

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

.. deatiled - 它适用于xmbc.org媒体报道

2 个答案:

答案 0 :(得分:1)

我是唯一一个不了解lennyd在第一个例子中想要什么的人吗?

现在为这个

输入

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 o 26之间变化,则只需运行3个正则表达式

如果你想要一些更灵活的东西,你需要一些强大的应用程序,如linux上的GREP或一些带有其他操作系统UI的克隆,可以做“正则表达式里面的正则表达式”

如果它的某些脚本语言运行正则表达式函数,您可以轻松地将以下内容包装在循环中,直到输入不再匹配任何内容为止 {

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  

}

答案 1 :(得分:0)

一个非常原始的正则表达式将是:

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

但我同意 Alan Moore ,您的示例输出有点连线。