如何组合正则匹配Excel公式单元格引用且排除IF/OR/AND函数内内容
解决方案
合并后正则模式
你可以直接使用如下兼容AutoHotkey正则引擎(PCRE标准)的正则:
(?:OR|AND)\([^)]*\)(*SKIP)(*FAIL)|IF\([^;]*;(*SKIP)(*FAIL)|(\$?[A-Za-z]+\$?\d+)
正则逻辑说明
- 第一部分
(?:OR|AND)\([^)]*\)(*SKIP)(*FAIL):匹配所有OR、AND函数的完整函数体,标记为直接跳过不处理 - 第二部分
IF\([^;]*;(*SKIP)(*FAIL):匹配IF(到第一个分号的条件区域,标记为直接跳过不处理 - 第三部分
(\$?[A-Za-z]+\$?\d+):剩余内容中匹配所有带/不带绝对引用符$的Excel单元格引用,支持A1、$A1、A$1、$A$1四种格式
效果验证
针对你给出的测试公式=IF(OR(A1=1;A2=2);B1+B2;B3+B4),该正则会精准匹配到B1、B2、B3、B4,完全忽略IF条件区、OR函数内部的A1、A2,符合需求。
修改后完整AutoHotkey代码
+^c Up:: Send ^c ClipWait ; 等待剪贴板写入完成,避免取值错误 ; 第一步:跳过IF/OR/AND排除区域,将单元格引用包裹为ROUND函数 Clipboard := RegExReplace(Clipboard, "(?:OR|AND)\([^)]*\)(*SKIP)(*FAIL)|IF\([^;]*;(*SKIP)(*FAIL)|(\$?[A-Za-z]+\$?\d+)", "ROUND($1;2)") ; 第二步:替换运算符为带引号的连接格式 Clipboard := RegExReplace(Clipboard, "([\+\-\*\/\(\)])", "&""$1""&") ; 第三步:清理首尾多余的&符号 Clipboard := Trim(Clipboard, "&") return
内容的提问来源于stack exchange,提问作者Mikifp
相关产品推荐
相关产品推荐

