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

Ars*_*eep 0 regex screen-scraping

我试过以下表达式.

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


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

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

例如:

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

http://domain.com/path.html<
Run Code Online (Sandbox Code Playgroud)

注意

" <
Run Code Online (Sandbox Code Playgroud)

我不希望他们使用URL.

pol*_*nts 7

您可以使用前瞻而不是['\"\< >]参与匹配,即:

(http:\/\/.*?)(?=['\"\< >])
Run Code Online (Sandbox Code Playgroud)

一般来说,ab匹配ab,a(?=b)匹配a(如果它后面跟着b).

参考

相关问题


捕获组选项

所有口味都不支持Lookarounds.更广泛支持的是捕获组.

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

参考

相关问题


否定字符类选项

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

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

我们使用以下作为输入:

eeAiiZooAuuZZeeeZZfff
Run Code Online (Sandbox Code Playgroud)

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

  • A(.*)ZZ产生1个匹配:AiiZooAuuZZeeeZZ(上ideone.com所见)
    • 这是贪婪的变种; 第1组匹配并捕获iiZooAuuZZeee
  • A(.*?)ZZ产生1个匹配:AiiZooAuuZZ(上ideone.com所见)
    • 这是不情愿的变种; 第1组匹配并捕获iiZooAuu
  • A([^Z]*)ZZ产生1个匹配:AuuZZ(上ideone.com所见)
    • 这是否定的字符类变体; 第1组匹配并捕获uu

以下是它们匹配的直观表示:

         ___n
        /   \              n = negated character class
eeAiiZooAuuZZeeeZZfff      r = reluctant
  \_________/r   /         g = greedy
   \____________/g
Run Code Online (Sandbox Code Playgroud)

参考

相关问题