Go正则不使用环视功能如何匹配不包含指定单词的字符串
适配Go RE2引擎的无环视正则方案
符合你要求的纯原生正则(无环视、无额外捕获分组,仅匹配符合条件的new MyClass声明)如下:
(?s)new\sMyClass\((?:[^n]|n(?:[^e]|e(?:[^w]|w(?:\s[^A]|\sA(?:[^n]|n(?:[^o]|o(?:[^t]|t(?:[^h]|h(?:[^e]|e(?:[^r]|r(?:[^C]|C(?:[^l]|l(?:[^a]|a(?:[^s]|s(?:[^s]|s[^(]))))))))))))))*\)
匹配效果说明
直接命中你要求的case 0、1、4、8,所有包含new AnotherClass作为参数的case都会被排除,不需要额外做分组过滤。
实现原理
因为Go标准库的正则是RE2引擎,不支持环视语法,所以采用逐段排除禁止子串的实现逻辑:
- 每一步匹配都确保不会出现完整的
new AnotherClass(子串 - 从首字符
n开始逐层校验前缀,只要任意前缀不匹配就允许继续匹配 - 开头的
(?s)标记开启点号匹配换行,支持跨行的参数声明场景
内容的提问来源于stack exchange,提问作者securisec
相关产品推荐
相关产品推荐

