我正在尝试创建一个正则表达式,以有效地清除/屏蔽文本字符串中的所有URL,但我知道/信任的域中的URL除外。
例如,我信任的域是safedomain.com和safedomain.com.au,并且可以字符串形式显示为以下“ SAFE”组合中的任何一个(在前面或后面带有或没有文本)
我已经能够编写一个正则表达式来标识这些SAFE URL的任何格式(即是否使用HTTP,WWW,.com和.com.au)
((?:(?:http|ftp|https):\/\/)?(?:www\.|\b)(?:safedomain\.(?:com\.au|com)(?:[\\\/]\S*|\w*)))
我还找到了一个可以成功识别给定字符串中所有URL的正则表达式示例
((?:(?:http|ftp|https):\/\/)?(?:[\w_-]+(?:(?:\.[\w_-]+)+))(?:[\w.,@?^=%&:\\\/~+#-]*[\w@?^=%&\/~+#-])?)
所以从这里开始,我想我可以简单地将每个正则表达式放在它自己的捕获组之上,然后使用负前瞻进行比较。如果SAFE正则表达式的结果与ALL正则表达式匹配,则忽略该结果。否则,如果没有匹配项,则将所有URL替换为#hidden#值
这是我的尝试(也在此处https://regex101.com/r/RJp1PD/2)
(?!(?:(?:(?:http|ftp|https):\/\/)?(?:www\.|\b)(?:safedomain\.(?:com\.au|com)(?:[\\\/]\S*|\w*))))(?:(?:(?:http|ftp|https):\/\/)?(?:[\w_-]+(?:(?:\.[\w_-]+)+))(?:[\w.,@?^=%&:\/~+#-]*[\w@?^=%&\\\/~+#-])?)
它正在隐藏不匹配的所有URL-但是,它仍在尝试在第一个字符后替换SAFE URL,例如 safedomain.com 更改为 s#hidden#
这是我的第一时间尝试使用否定的前瞻,因此,如果我对出错的地方提出任何建议,将不胜感激。
答案 0 :(得分:1)
否定的超前行为是检查是否跟随SAFE URL,并且如果不这样做,它将跳过该位置而不会消耗任何字符,这意味着它将仅移至下一个字符。否定的前瞻不会找到SAFE URL,因此将检查语句的其余部分,并将找到有效的URL,例如“ afedomain.com”,它将匹配并替换。
解决此问题的方法是仅检查完整的URL,这意味着要检查的位置必须是URL的开头,即位于行的开头或空格之后。您可以在字词或点后面使用负向后看:(?<!\.|\w)
(?<!\.|\w)(?!(?:(?:(?:http|ftp|https):\/\/)?(?:www\.|\b)(?:safedomain\.(?:com\.au|com)(?:[\\\/]\S*|\w*))))(?:(?:(?:http|ftp|https):\/\/)?(?:[\w_-]+(?:(?:\.[\w_-]+)+))(?:[\w.,@?^=%&:\/~+#-]*[\w@?^=%&\\\/~+#-])?)
请注意:您的正则表达式与safedomain.com.fake.com之类的不匹配