如何编写正则表达式匹配含指定字符串的单个YARA规则
匹配包含特定字符串的单个YARA规则正则方案
问题分析
你当前使用的正则^rule\s[\s\S]*?(?=BANANAS)[\s\S]*?^\}$会跨规则匹配,核心原因是[\s\S]*?会无差别匹配任意字符(包括换行和其他规则内容),导致从第一个规则开始抓取,直到找到BANANAS所在规则的结尾,中间无关规则也被包含进来。
解决方案
使用负向前瞻限制匹配范围,确保只在单个规则内部查找目标字符串,不会跨越到其他规则。修正后的正则如下:
(?:^|\n)rule\s(?:(?!(?:^|\n)rule)[\s\S])*BANANAS(?:(?!(?:^|\n)rule)[\s\S])*(?:^|\n)\}
正则各部分说明
(?:^|\n)rule\s:匹配YARA规则的起始位置,确保是文件开头或换行后的rule关键字(避免匹配规则内部的rule字符串)(?:(?!(?:^|\n)rule)[\s\S])*:非捕获组,匹配任意字符,但前提是当前位置不是新规则的起始(通过负向前瞻(?!(?:^|\n)rule)实现),保证匹配范围不跨越到下一个规则BANANAS:精确匹配目标字符串(?:(?!(?:^|\n)rule)[\s\S])*:继续匹配规则剩余内容,同样限制在当前规则内部(?:^|\n)\}:匹配规则的闭合大括号,确保是文件开头或换行后的独立行(符合YARA规则的格式规范)
验证逻辑
这个正则会逐个扫描规则,只捕获包含BANANAS的完整规则,完全避免跨规则匹配的问题,同时满足你要求的:
- 不使用内置多行匹配函数
- 用
[\s\S]替代.*匹配任意字符
内容的提问来源于stack exchange,提问作者rilo
相关产品推荐
相关产品推荐

