PCRE正则匹配:如何排除含FCMP的行匹配指定数值表达式
解决思路:用负向前瞻排除指定行
这问题我之前处理汇编指令匹配时碰到过类似的,核心就是先排除包含FCMP的行,再匹配你要的#X.Y格式表达式,用正则的负向前瞻就能轻松实现。
最终正则表达式
^(?!.*FCMP).*#-?\d+\.\d
逐部分解释
^:锚定到行的开头,确保我们从整行的起始位置开始判断(?!.*FCMP):负向前瞻断言,意思是「从当前位置往后,整个行里都不能出现FCMP这个字符串」,直接把所有含FCMP的行排除在外.*:匹配行开头到目标表达式之间的任意内容(比如汇编行里的地址、指令名这些前缀)#-?\d+\.\d:这是你要匹配的目标格式,我调整了原正则让它更精准:#:匹配固定的#符号-?:匹配可选的负号(支持#-1.0这种带负号的情况)\d+:匹配一个或多个整数位数字\.:转义后的点号(避免正则里的通配符.干扰)\d:匹配至少一个小数位数字
验证示例
- 能匹配的行:
.text:00000000005A2F7C FMOV D1, #1.0→ 行内无FCMP,且包含符合格式的#1.0 - 会跳过的行:
.text:00000000005A2F70 FCMP D0, #0.0→ 因为行内有FCMP,被负向前瞻直接排除
额外小技巧
如果你的工具支持分步处理(比如命令行),也可以拆成两步更直观:
- 先过滤掉所有含FCMP的行:
grep -v FCMP your_file.txt - 再从剩下的行里匹配目标表达式:
grep -E '#-?\d+\.\d'
这样拆分有时候比写复杂正则更容易维护,看你使用的场景来选就行。
内容的提问来源于stack exchange,提问作者Дима Попиль
相关产品推荐
相关产品推荐

