【问题标题】:Regex - repeating matches正则表达式 - 重复匹配
【发布时间】:2010-02-07 07:12:53
【问题描述】:

另一个正则表达式问题

我输入了这样的文本:

test start first end start second end start third end

我需要这样的匹配:

test first
test second 
test third

我尝试过类似的方法:

start(.*?)end

但是如何添加“测试”?

感谢您的建议

伦尼德

(已编辑 - 输入文本有错误)


没有机会使用另一种编程语言,它应该只是正则表达式。我需要它来解析具有(部分)语法的网页,如下所示:

第1季 第1集 第 2 集 第 3 集 第2季 第1集 第 2 集 ...ETC

有了这个正则表达式,我需要像这样的输出


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

.. deatiled - 它用于 xmbc.org 媒体抓取工具

【问题讨论】:

  • 由于您要查找的匹配项在您的输入文本中以该形式不存在,因此您必须使用周围编程语言的某些功能。你使用什么语言?
  • 正则表达式并不总是完成任务的最佳工具。完成后,您是否有理由不能简单地在每场比赛的开头添加“测试”?
  • 你的意思是xbmc.org 吗?这是一个非常重要的细节。这不是“只是正则表达式”;我们也需要熟悉框架,这不是一个微不足道的要求。 (出于同样的原因,我不会尝试回答 Yahoo Pipes 正则表达式问题。)此外,他们似乎使用的是本土的正则表达式风格,因此即使我们对正则表达式的了解也可能对您没有帮助。

标签: regex


【解决方案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 到 26 之间变化,只需运行 3 次正则表达式

如果你想要更灵活的东西,你需要一些强大的应用程序,比如 linux 上的 GREP,或者一些带有 UI 的克隆,用于其他操作系统,可以执行“regex inside regex”

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

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  

}

【讨论】:

    【解决方案2】:

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

    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 的观点,您的采样输出有点连线。

    【讨论】:

    • 仅供参考,我撤回了我的答案。原因请参阅编辑后的问题和我在其下方的评论。
    • 在这种情况下,您不需要正则表达式。正则表达式适用于它们的目标:解析字符串。在您的情况下,您有一个字符串列表,您希望通过最少的解析将其转换为 XML。我会使用一些编程语言结构来完成这项工作(遍历列表并生成 XML)。如果您滥用正则表达式,只会使您的代码难以阅读。
    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多