2

有正则表达式〜像这样:

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

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

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”或“”

4

3 回答 3

0

你不应该需要.+?一开始,正则表达式无论如何都会搜索整个输入

您在空白之后也有结束的“>”,这将限制您的匹配

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

正则表达式测试

于 2011-03-07T02:09:43.807 回答
0

Are you doing a whole-string match? If so, try adding .* to the end of the first regex and see what it matches. The problem with the first regex is that it can match anything after blablabla because of the .+? (leading to an empty capture), but the parenthesized part still won't match an a tag unless it's at the end of the string. By the way, looking at your expected output, capture 1 will be the URL; the parentheses around the whole HTML tag are non-capturing because of the ?: at the beginning.

于 2011-03-07T01:45:46.620 回答
0

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

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

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

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

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

如果属性未按指定的顺序列出,这将失败......这是正则表达式不能真正用于解析 html 的原因之一。但是,如果您确定 href 将始终位于目标之前,那么这应该可以满足您的需要。

于 2011-03-07T03:22:28.867 回答