[英]regex c# optional group - should act greedy?
正则表达式〜像这样:
blablabla.+?(?:<a href="(http://.+?)" target="_blank">)?
如果要找到一个URL,我想捕获一个URL ...找到内容,但没有链接(捕获始终为空)。 现在,如果我这样删除结尾的问号
blablabla.+?(?:<a href="(http://.+?)" target="_blank">)
这只会匹配结尾处有链接的内容...是2.40 am ...我不知道...
- 编辑 -
样本输入:
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”或“”
您正在做一整串比赛吗? 如果是这样,请尝试在第一个正则表达式的末尾添加.*
,并查看其匹配项。 第一个正则表达式的问题在于,由于.+?
,它可以匹配blablabla
之后的所有内容.+?
(导致空捕获),但括号内的部分仍然不匹配的a
,除非它是在字符串的结束标记。 顺便说一下,查看您的预期输出,捕获1将是URL; 整个HTML标记的括号由于开头的?:
而无法捕获。
您不需要。+? 在开始时,正则表达式仍然会搜索整个输入
您还可以在空格后紧跟'>',这将限制您的比赛
(?:<a href="(http://.+?)" target="_blank".*?>)
是拖尾吗? 原因:通过将其标记为可选,您就允许。+吗? 抓住它。
blablabla.*(?:<a href="((http://)?.*)".+target="_blank".*>)
我修改了它咯... .+?
基本上与.*
相同,并且如果您的href中没有任何内容(您表示想要的是“”),则需要使http以及尾随的文本成为可选内容。 另外,最前面的target
.*
表示您至少有一个空格或字符,但可能有更多(多个空格或其他属性)。 >
之前的.*
,表示后面可以有空格或其他属性。
如果没有<a href...>
,则根本不会匹配任何<a href...>
,但这就是您想要的,对吗?
如果您不需要捕获整个<a href...>
部分,则可以完全删除(?: ... )
。
如果未按指定的顺序列出属性,则此操作将失败...这是不能真正使用regex解析html的原因之一。 但是,如果您确定href总是会出现在目标之前,那么这应该可以满足您的需求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.