繁体   English   中英

正则表达式C#可选组-应该贪心吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM