我有一个小问题,我想找到
<tr><td>3</td><td>foo</td><td>2</td>
foo,我使用:
$<tr><td>\d</td><td>(.*)</td>$
找到 foo,但它不起作用,因为它与 foo 的末尾不匹配,</td>
但与</td>
字符串末尾的 the不匹配
我有一个小问题,我想找到
<tr><td>3</td><td>foo</td><td>2</td>
foo,我使用:
$<tr><td>\d</td><td>(.*)</td>$
找到 foo,但它不起作用,因为它与 foo 的末尾不匹配,</td>
但与</td>
字符串末尾的 the不匹配
你必须让.*
懒惰而不是贪婪。在此处阅读有关懒惰与贪婪的更多信息。
您的字符串锚 ( $
) 的结尾也没有意义。尝试:
<tr><td>\d<\/td><td>(.*?)<\/td>
(如rubular 所示。)
注意:我不提倡使用正则表达式来解析 HTML。但有时手头的任务很简单,可以由正则表达式处理,而成熟的 XML 解析器对于这种情况来说太过分了(例如:this question)。知道为工作选择“正确的工具”是编程中的一项重要技能。
采用:
^<tr><td>\d</td><td>(.*?)</td>
(插入关于不使用正则表达式解析 xml 的强制性评论)
你的领先$
应该是^
.
如果您不想一直匹配到字符串的末尾,请不要$
在末尾使用 a。然而,由于*
它是贪婪的,它会尽可能多地抓住它。一些正则表达式实现有一个可以工作的非贪婪版本,但您可能只想更改(.*)
为([^<]*)
.