用户代理匹配需要Regex帮助

bsxbgnwa  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(130)

我使用过一个在线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

  1. 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
gkn4icbw

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]?)\.shadowserver\.org
  • 说明 *

(scan-\d+[a-z]?),组1:将捕获单词scan,后跟文字-,后跟\d+一个或多个数字,后跟可选的小写字母[a-z]??使[a-z]部分可选,如果不使用,则[a-z]意味着必须只有一个小写字母。
参见regex demo

相关问题