我有一个正则表达式表达式,该表达式与字符串中的URL匹配,这些URL不在引号之间。效果很好,但是我有一个小问题。
处理引号的部分是捕获URL(通常是https)之前的第一个字符(也可以是空格)。
这是正则表达式:
/(?:^|[^"'])(ftp|http|https|file):\/\/[\S]+(\b|$)/gim
您可以对其进行测试,并且会在URL前面看到这种不必要的匹配(如果您在URL前面当然键入任何内容)。
如何获得正确的全场比赛?
答案 0 :(得分:2)
non-capturing group (?:^|[^"'])
与'
否定的字符类别匹配并消耗除"
和[^'"]
以外的其他字符。当消耗了char时,会将其添加到整个匹配值中。捕获组不执行的操作是将匹配的子字符串添加到单独的内存缓冲区中,因此,找到匹配项后您将无法再访问它。
通常的解决方案是:
(?:^|[^"'])((?:ftp|https?|file):\/\/\S+)(?:\b|$)
模式)(?<!["'])
后向负向),该匹配项仅匹配未紧接在'
或"
之后的位置:(?<!["'])(?:ftp|https?|file):\/\/\S+(?:\b|$)
。