【问题标题】:How to get this regex working?如何让这个正则表达式工作?
【发布时间】:2010-09-01 18:22:44
【问题描述】:

我有一个小问题,我想在

<tr><td>3</td><td>foo</td><td>2</td>

foo,我用:

$<tr><td>\d</td><td>(.*)</td>$

找到 foo,但它不起作用,因为它与 foo 末尾的 </td> 不匹配,但与字符串末尾的 </td> 不匹配

【问题讨论】:

  • 一般来说,您需要使用真正的 html 解析器,而不是正则表达式。见:stackoverflow.com/questions/1732348/…
  • @Seth,其他人:好的,将 HTML 解析器作为 comment 是可行的方法,而不是错误地浪费答案。好节目。
  • 另外:谁反对这个问题?这是一个很好的问题,问得很好。 (+1 偏移)
  • 不是您具体问题的答案,而是信息;关于开发/测试 RegEx,有一些令人惊叹的工具可以用英语为您解析它们,并向您展示它们正在做什么以及功能齐全的构建工具。我个人更喜欢 Expresso (ultrapico.com/Expresso.htm),但我敢肯定还有其他人。可以帮助您解决几乎所有 RegEx 需求。

标签: regex regex-greedy


【解决方案1】:

你必须让.* 变得懒惰而不是贪婪。阅读有关懒惰与贪婪的更多信息here
你的字符串锚($)的结尾也没有意义。试试:

<tr><td>\d<\/td><td>(.*?)<\/td>

(如 rubular 所见。)

注意:我不提倡使用正则表达式来解析 HTML。但有时手头的任务很简单,可以由正则表达式处理,而成熟的 XML 解析器对于这种情况来说太过分了(例如:this question)。知道为工作选择“合适的工具”是编程的一项重要技能。

【讨论】:

  • 我只想说这不是我(尽管我确实反对另一篇文章说 HTML 不规则,不应该用正则表达式解析)。你实际上是在回答这个问题。 (编辑:+1 给你)
【解决方案2】:

您的前导$ 应该是^

如果您不想一直匹配到字符串的末尾,请不要在末尾使用$。然而,由于* 是贪婪的,它会尽可能多地获取。一些正则表达式实现有一个可以工作的非贪婪版本,但您可能只想将(.*) 更改为([^&lt;]*)

【讨论】:

  • 确实,我很好奇这个答案有什么问题需要反对。唉。
【解决方案3】:

用途:

^<tr><td>\d</td><td>(.*?)</td>

(插入关于不使用正则表达式解析 xml 的强制性注释)

【讨论】:

    猜你喜欢
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    相关资源
    最近更新 更多