为何正则表达式[^;].*__ctrl1_.*\(无法排除含前置分号的行?
正则匹配问题解决
示例文本
; Obsidian__CTRL1_B(isHold, taps, state) Obsidian__CTRL1_N(isHold, taps, state) ; Opus__CTRL1_Z(isHold, taps, state) ; Opus__CTRL1_X(isHold, taps, state) ; Opus__CTRL1_C(isHold, taps, state)
问题描述
想要仅匹配不含前置分号;的行(即第2行),但使用正则[^;].*__ctrl1_.*\(时匹配了所有行,疑惑错误原因。
错误原因
[^;]的作用只是匹配单个非分号字符,而你的所有行开头都有空格(属于非分号字符),正则会把这些空格匹配为[^;],再加上后面的.*__ctrl1_.*\(能匹配行内目标内容,所以所有行都会被命中。它并没有限制“分号不能出现在目标内容之前”,只是找了一个非分号字符而已。
正确正则方案
使用行首锚定和负向前瞻来确保行首空白后没有分号:
^\s*(?!;).*__CTRL1_.*\(
各部分解释
^:锚定当前行的开头,确保匹配从行首开始\s*:匹配行首任意数量的空白字符(空格、制表符都包含)(?!;):负向前瞻断言,确保紧随空白后的字符不是分号.*__CTRL1_.*\(:匹配包含__CTRL1_且以左括号结尾的内容(若需忽略大小写,可添加i修饰符)
内容的提问来源于stack exchange,提问作者Ralf_Reddings
相关产品推荐
相关产品推荐

