正则表达式c#可选组 - 应该贪婪吗?

时间:2011-03-07 01:40:04

标签: c# regex optional greedy regex-group

有正则表达式〜像这样:

blablabla.+?(?:<a href="(http://.+?)" target="_blank">)?

我想捕获一个网址,如果我找到一个...找到的东西,但我没有得到链接(捕获总是空的)。现在,如果我像这样删除问号

blablabla.+?(?:<a href="(http://.+?)" target="_blank">)

这只会匹配最后有链接的东西......凌晨2点40分......我没有想法......

- 编辑 -

示例输入:

blablabla asd 1234t535 <a href="http://google.com" target="_blank">

预期产出:

match 0:

    group 1: <a href="http://google.com" target="_blank">
    group 2: http://google.com`

我只想要“http://google.com”或“”

3 个答案:

答案 0 :(得分:0)

你在做整串比赛吗?如果是这样,请尝试将.*添加到第一个正则表达式的末尾,并查看它匹配的内容。第一个正则表达式的问题在于它可以匹配blablabla之后的任何内容,因为.+?(导致空捕获),但括号内的部分仍然不匹配a标记除非它在字符串的末尾。顺便说一句,查看您的预期输出,捕获1将是URL;由于开头是?:,整个HTML标记周围的括号都是非捕获的。

答案 1 :(得分:0)

你应该不需要。+?在开始时,正则表达式无论如何都将搜索整个输入

你也有结束'&gt;'在空白之后,这将限制你的比赛

(?:<a href="(http://.+?)" target="_blank".*?>)

regex test

答案 2 :(得分:0)

这是尾随?那是你做的。原因:通过将其标记为可选,你允许。+?抓住它。

blablabla.*(?:<a href="((http://)?.*)".+target="_blank".*>)

我稍微修改了一下...... .+?.*基本相同,如果你的href中没有任何内容(你表示你想要“”),你需要制作http可选以及尾随文本。此外,.*前面的target表示您至少有一个空格或字符,但可能有更多(多个空格或其他属性)。 .*之前的>表示您可以跟踪空格或其他属性。

如果没有<a href...>,这根本就不匹配,但这就是你想要的,对吗?

如果您不需要捕获整个(?: ... )部分,则可以完全删除<a href...>

如果属性没有按照指定的顺序列出,这将失败...这是正则表达式无法真正用于解析html的原因之一。但是如果你确定href总是会在目标之前,那么这应该是你需要的。