有正则表达式〜像这样:
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”或“”
答案 0 :(得分:0)
你在做整串比赛吗?如果是这样,请尝试将.*
添加到第一个正则表达式的末尾,并查看它匹配的内容。第一个正则表达式的问题在于它可以匹配blablabla
之后的任何内容,因为.+?
(导致空捕获),但括号内的部分仍然不匹配a
标记除非它在字符串的末尾。顺便说一句,查看您的预期输出,捕获1将是URL;由于开头是?:
,整个HTML标记周围的括号都是非捕获的。
答案 1 :(得分:0)
你也有结束'&gt;'在空白之后,这将限制你的比赛
(?:<a href="(http://.+?)" target="_blank".*?>)
答案 2 :(得分:0)
这是尾随?那是你做的。原因:通过将其标记为可选,你允许。+?抓住它。
blablabla.*(?:<a href="((http://)?.*)".+target="_blank".*>)
我稍微修改了一下...... .+?
与.*
基本相同,如果你的href中没有任何内容(你表示你想要“”),你需要制作http可选以及尾随文本。此外,.*
前面的target
表示您至少有一个空格或字符,但可能有更多(多个空格或其他属性)。 .*
之前的>
表示您可以跟踪空格或其他属性。
如果没有<a href...>
,这根本就不匹配,但这就是你想要的,对吗?
如果您不需要捕获整个(?: ... )
部分,则可以完全删除<a href...>
。
如果属性没有按照指定的顺序列出,这将失败...这是正则表达式无法真正用于解析html的原因之一。但是如果你确定href总是会在目标之前,那么这应该是你需要的。