仅匹配所有“http”网址,而不包含其他字符

时间:2010-07-13 12:13:11

标签: regex screen-scraping

我尝试了以下表达方式。

(http:\/\/.*?)['\"\< \>]


(http:\/\/[-a-zA-Z0-9+&@#\/%?=~_|!:,.;\"]*[-a-zA-Z0-9+&@#\/%=~_|\"])

第一个表现不错但总是给出匹配网址的最后一个额外字符。

例如:

http://domain.com/path.html" 

http://domain.com/path.html<

注意

" <

我不希望他们使用网址。

3 个答案:

答案 0 :(得分:7)

您可以使用前瞻,而不是将['\"\< >]作为匹配的一部分,即:

(http:\/\/.*?)(?=['\"\< >])

一般来说,ab匹配aba(?=b)匹配a(如果后跟b)。

参考

相关问题


捕获组选项

所有口味都不支持外观。更广泛支持的是捕获群体。

一般来说,虽然(a)b仍匹配ab,但它也会在第1组中捕获a

参考

相关问题


否定字符类选项

根据需要,使用否定字符类通常比使用不情愿的.*?要好得多(在这种情况下后跟一个先行来断言终止符模式)。

让我们考虑匹配“AZZ之间的所有内容”的问题。事实证明,这个规范是模棱两可的:我们将提出3种模式来实现这一点,它们将产生不同的匹配。哪一个是“正确的”取决于期望,这在原始陈述中没有恰当地传达。

我们使用以下作为输入:

eeAiiZooAuuZZeeeZZfff

我们使用3种不同的模式:

  • A(.*)ZZ产生1个匹配:AiiZooAuuZZeeeZZas seen on ideone.com
    • 这是贪心变种;第1组匹配并捕获iiZooAuuZZeee
  • A(.*?)ZZ产生1个匹配:AiiZooAuuZZas seen on ideone.com
    • 这是不情愿的变体;第1组匹配并捕获iiZooAuu
  • A([^Z]*)ZZ产生1个匹配:AuuZZas seen on ideone.com
    • 这是否定字符类变体;第1组匹配并捕获uu

以下是他们匹配内容的直观表示:

         ___n
        /   \              n = negated character class
eeAiiZooAuuZZeeeZZfff      r = reluctant
  \_________/r   /         g = greedy
   \____________/g

参考

相关问题

答案 1 :(得分:1)

您需要使用“(?= regex )”(lookahead),它会查找特定模式,但不会在结果中包含它:

http:\/\/.*?(?=['\"\< >])

答案 2 :(得分:1)

嗯,我可能只是简单地说“继续前进,直到你得到一个不受欢迎的角色”,就像这样:

http://[^'"< >]*

Escaped version(基于Q - 不确定这是什么引擎):

http:\/\/[^'\"\< >]*

然而,lookahead solution by polygenelubricants是一种更灵活的方式,如果你可能在URL中有一些这些字符(但不是在最后)。