如何使这个正则表达式有效?

3
我有一个小问题,我想在以下代码中查找 "foo": < tr >< td >3< /td >< td >foo< /td >< td >2< /td > 我使用以下正则表达式进行匹配: $<tr><td>\d</td><td>(.*)</td>$ 但是它没有起作用,因为它与 foo 后面的 </td> 不匹配,而是与字符串末尾的 </td> 匹配。

5
通常来说,您应该使用真正的 HTML 解析器,而不是正则表达式。请参阅以下链接:https://dev59.com/X3I-5IYBdhLWcg3wq6do#1732454 - Seth
@ Seth,其他人:好的,把HTML解析器作为注释说出来是正确的方法,而不是浪费答案。干得好。 - Platinum Azure
1
还有:谁在给这个问题点踩?这是一个好问题,提问得很好。(+1 抵消) - Platinum Azure
虽然不是针对您具体问题的答案,但是关于开发/测试正则表达式,有一些非常棒的工具可以帮助您解析英文并展示它们的完整功能。个人更喜欢Expresso(http://ultrapico.com/Expresso.htm),但我相信还有其他工具。这些工具几乎可以帮助您解决任何正则表达式需求。 - eidylon
3个回答

2

你需要将.*改为“懒惰模式”而不是“贪婪模式”。在这里了解更多关于懒惰和贪婪的区别。
同时,你使用的字符串末尾锚点 ($) 也不太合适。可以试试这个:

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

(来自 rubular 的示例。)

注意:我不主张使用正则表达式解析HTML。但有时候,处理的任务足够简单,可以通过正则表达式处理,而完整的XML解析器则过于复杂(例如:这个问题)。在编程中,选择“合适的工具”是一项重要的技能。


我只想说这不是我的错(尽管我曾因为另一篇帖子声称HTML不规则而对其进行了踩)。你实际上正在回答问题。(编辑:+1给你) - Platinum Azure

0

使用:

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

(插入必要的注释,关于不使用正则表达式解析XML)


0

你的主要 $ 应该改为 ^

如果你不想匹配到字符串的结尾,就不要在末尾使用 $。但是,因为 * 是贪婪的,它会尽可能多地获取匹配内容。 一些正则表达式实现有一个非贪婪版本可以使用,但你可能只需要将 (.*) 更改为 ([^<]*)


实际上,我很好奇这个答案有什么错,需要被踩。唉。 - dash-tom-bang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接