Regex 正则表达式捕获所有出现的字符,但某些字符的最后一个除外

Regex 正则表达式捕获所有出现的字符,但某些字符的最后一个除外,regex,Regex,当我的客户键入包含URL的句子时,我想从URL正则表达式检测器中排除常用标点符号。一个常见的场景是URLexample.com?q=this(显然需要包含?)而不是说 你觉得example.com怎么样 这个表达很适合我的需要: (?:https?\:\/\/)?(?:\w+\)+\w{2,}(?:[?\/]\S*)? 但是,它在末尾包含了所有标点符号,因此我将遍历每个匹配项,以查找并使用捕获的组来排除所述标点符号: (.*?[?,!;:]+$ 但是,我不知道在扫描可能有多个URL的整个文本块时

当我的客户键入包含URL的句子时,我想从URL正则表达式检测器中排除常用标点符号。一个常见的场景是URL
example.com?q=this
(显然需要包含
)而不是说

你觉得example.com怎么样

这个表达很适合我的需要:

(?:https?\:\/\/)?(?:\w+\)+\w{2,}(?:[?\/]\S*)?

但是,它在末尾包含了所有标点符号,因此我将遍历每个匹配项,以查找并使用捕获的组来排除所述标点符号:

(.*?[?,!;:]+$


但是,我不知道在扫描可能有多个URL的整个文本块时如何利用“字符串结尾”技术。希望有一种方法可以在不需要额外工作的情况下从一开始就捕获正确的块。

只需要在标点符号后添加非空格,而不是将其设置为可选

(?:https?\:\/\/)?(?:\w+\.)+\w{2,}(?:[?#\/]\S+)?

当然,您将丢失URL的有效结尾,例如example.com/将成为example.com,但据我所知,没有区别。

这仍然捕获了尾随标点符号。它适用于
example.com?
,但不适用于
example.com?a=foo?