如何使这个正则表达式工作?

时间:2010-09-01 18:22:45

标签: regex regex-greedy

我有一个小问题,我想找到

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

foo,我用:

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

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

3 个答案:

答案 0 :(得分:2)

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

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

(见rubular。)

注意:我不主张使用正则表达式来解析HTML。但有时候手头的任务很简单,可以由正则表达式处理,因为完整的XML解析器是过度的(例如:这个问题)。知道选择“适合工作的工具”是编程的一项重要技能。

答案 1 :(得分:0)

使用:

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

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

答案 2 :(得分:0)

您的潜在$应为^

如果您不想匹配字符串末尾的所有方式,请不要在结尾处使用$。但是,由于*是贪婪的,它会尽可能地抓住它。一些正则表达式实现有一个非贪婪的版本可行,但您可能只想将(.*)更改为([^<]*)