我需要创建一个正则表达式以匹配除给定Referer的特定URL外的所有内容。我目前可以匹配它,但不能将其反转并为其创建负片。
我目前拥有的东西:
Referer:(http(s)?(:\/\/))?(www\.)?test.com(\/.*)?
在下面的列表中:
Referer:http://www.test.online/
Referer:https://www.test.online/
Referer:https://www.test.tv/
Referer:https://www.blah.com/
Referer:https://www.test.com/
Referer:http://www.test.com/
Referer:http://test.com/
Referer:https://test.com/
它将匹配:
Referer:https://www.test.com/
Referer:http://www.test.com/
Referer:http://test.com/
Referer:https://test.com/
但是,我希望它可以匹配除这些以外的所有内容。
这是给我们的WAF使用的,因此很遗憾,它的用法受到限制,只能通过搜索传回的HTTP标头来实现。
答案 0 :(得分:1)
尝试此正则表达式:
^(?!.*Referer:(http(s)?(:\/\/))?(www\.)?test.com(\/.*)?).*$
否定正则表达式的一种好方法是使用负前瞻。
说明:
否定的超前构造是一对圆括号,圆括号开头是一个问号和一个感叹号。在内部[任何正则表达式模式]。
答案 1 :(得分:0)
您可以使用锚点^
来声明字符串的开头,并使用否定的前行来声明右边的内容与您要匹配的内容不符。
请注意,您必须对点进行转义以使其在字面上匹配,并且可以省略最后一部分(\/.*)?
。
如果您不使用捕获组以后再使用,也可以将它们变成非捕获组(?:)
。
^(?!Referer:(https?(:\/\/))?(www\.)?test\.com).+$
关于图案
^
字符串的开头(?!
负向超前断言右边的内容不匹配
Referer:(https?(:\/\/))?(www\.)?test\.com
匹配您的模式)
近距离否定预测.+
匹配除换行符1次以上以外的所有字符$
声明字符串的结尾