我使用过一个在线regex学习网站(regexr),并创建了一些有效的东西,但由于我在regex创建方面的经验非常有限,我可以得到一些帮助/建议。
在IIS10日志中,有一个时间、日期等的列表,但我只对cs(用户代理)字段感兴趣。
我的正则表达式:
第一个月
它与这些匹配:
scan-02.shadowserver.org
scan-15n.shadowserver.org
scan-42o.shadowserver.org
scan-42j.shadowserver.org
scan-42b.shadowserver.org
scan-47m.shadowserver.org
scan-47a.shadowserver.org
scan-47c.shadowserver.org
scan-42a.shadowserver.org
scan-42n.shadowserver.org
scan-42o.shadowserver.org
但我希望它能做的是
1.匹配单个号码,并可选择捕获多个号码:scan-2或scan-02,带有可选字母:扫描-2j或02f
- Append the rest of the User Agent: .shadowserver.org to the regex.
然后,我将把它添加到现有的URL重写规则(作为一个条件)以中止请求。
任何建议/帮助都将不胜感激
尝试:
为IIS10编写正则表达式以阻止来自某个用户代理的请求
预期:
它可以处理单个数字以及带或不带字母的双/三重数字。(scan\-\d+)(?:\w)+\.shadowserver\.org
输入文本:
scan-2.shadowserver.org
scan-02.shadowserver.org
scan-2j.shadowserver.org
scan-02j.shadowserver.org
scan-17w.shadowserver.org
scan-101p.shadowserver.org
更新:
我最终想到了这个:
scan\-[0-9]+[a-z]{0,1}\.shadowserver\.org
1条答案
按热度按时间gkn4icbw1#
这是你的正则表达式模式的 * 解释 * 如果你只想要解决方案,然后直接走到最后。
第一个月
(scan\-\d+)
组1:匹配单词scan
后面跟一个字面量-
,你用\
转义了连字符,但是如果你保留它而不转义它也意味着字面量-
,所以你不必在这里转义它,-
后面跟\d+
意味着0-9
后面的一个数字必须至少有一个数字,则该组内的值将被保存在第一捕获组内。(?:\w)+
非捕获组,\w
等于[A-Za-z0-9_]
的一个字符,但是在非捕获组(?:\w)+
之后的加号+
意味着匹配整个组一次或多次,该组仅包含\w
,这意味着它将匹配一个或多个单词字符,注意,这里的非捕获组是冗余的,并且在这种情况下我们可以直接使用\w+
。举两个例子:
scan-02.shadowserver.org
(scan\-\d+)(?:\w)+
scan
将匹配scan-02
中的单词scan
,并且\-
将匹配扫描scan-
之后的连字符,表示匹配一个或多个数字的\d+
首先将匹配scan-
之后的02
,并且值将是scan-02
,然后是(?:\w)+
部分,加号+
表示匹配一个或多个单词字符,至少匹配一个,它将尝试匹配句点.
,但会失败,因为句点.
不是单词字符,此时,您认为它结束了吗?不,regex引擎将返回到以前的\d+
,并且这次它将只匹配scan-02
中的0
,并且值scan-0
将被保存在第一捕获组内,则(?:\w)+
部分将匹配scan-02
中的2
,但是为什么引擎返回到\d+
?这是因为您在\d+
,(?:\w)+
之后使用了+
符号,(?:\w)+
分别表示匹配至少一个数字和一个单词字符,所以它会尝试去做字面上要求它做的事情。scan-2.shadowserver.org
(scan\-\d+)(?:\w)+
(scan\-\d+)
将匹配scan-2
,(?:\w)+
将尝试匹配scan-2
之后的句点,但是它失败了,这是这里的要点,然后它将返回到字符串scan-2.shadowserver.org
的开头,并且再次尝试匹配(scan\-\d+)
,但是从字符串中的字符c
开始,因此(scan\-\d+)
中的s
无法匹配c
,它将继续尝试,最后将失败。简单解决方案:
(scan-\d+[a-z]?)
,组1:将捕获单词scan
,后跟文字-
,后跟\d+
一个或多个数字,后跟可选的小写字母[a-z]?
?
使[a-z]
部分可选,如果不使用,则[a-z]
意味着必须只有一个小写字母。参见regex demo