我尝试了以下表达方式。
(http:\/\/.*?)['\"\< \>]
(http:\/\/[-a-zA-Z0-9+&@#\/%?=~_|!:,.;\"]*[-a-zA-Z0-9+&@#\/%=~_|\"])
第一个表现不错但总是给出匹配网址的最后一个额外字符。
例如:
http://domain.com/path.html"
http://domain.com/path.html<
注意
" <
我不希望他们使用网址。
答案 0 :(得分:7)
您可以使用前瞻,而不是将['\"\< >]
作为匹配的一部分,即:
(http:\/\/.*?)(?=['\"\< >])
一般来说,ab
匹配ab
,a(?=b)
匹配a
(如果后跟b
)。
所有口味都不支持外观。更广泛支持的是捕获群体。
一般来说,虽然(a)b
仍匹配ab
,但它也会在第1组中捕获a
。
根据需要,使用否定字符类通常比使用不情愿的.*?
要好得多(在这种情况下后跟一个先行来断言终止符模式)。
让我们考虑匹配“A
和ZZ
之间的所有内容”的问题。事实证明,这个规范是模棱两可的:我们将提出3种模式来实现这一点,它们将产生不同的匹配。哪一个是“正确的”取决于期望,这在原始陈述中没有恰当地传达。
我们使用以下作为输入:
eeAiiZooAuuZZeeeZZfff
我们使用3种不同的模式:
A(.*)ZZ
产生1个匹配:AiiZooAuuZZeeeZZ
(as seen on ideone.com)
iiZooAuuZZeee
A(.*?)ZZ
产生1个匹配:AiiZooAuuZZ
(as seen on ideone.com)
iiZooAuu
A([^Z]*)ZZ
产生1个匹配:AuuZZ
(as seen on ideone.com)
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中有一些这些字符(但不是在最后)。