Neo4j Cypher正则表达式匹配失败原因咨询:特定路径匹配失效
问题出在正则的转义处理上!
你踩了一个很常见的正则转义坑——你写的\\software被正则引擎当成了匹配空白字符的元字符,而不是你想要的字面量\s组合,这就是第一个表达式匹配失败的原因。
来拆解一下:
- 你的
TargetObject实际值是hklm\software\microsoft\windows\currentversion\run\xyz,里面的路径分隔符是单个反斜杠\。 - 在Cypher字符串里,单个反斜杠需要用
\\转义才能表示字面量的\;但在正则表达式中,\本身也是转义字符,要匹配字面量的\,正则里得写\\。 - 两者叠加,要在Cypher的正则里匹配一个字面量的
\,你得写成\\\\(Cypher转义一次成\\,正则再转义一次成\)。
你第一个表达式里的\\software,到了正则引擎那里会被解析成\software——这里的\s是正则的特殊元字符,用来匹配空白字符(比如空格、制表符),而不是你需要的\+s组合。这就导致你的正则在找hklm后面跟一个空白符,再接oftware...,显然和实际的路径完全不匹配。
而第二个表达式hklm\\.*能成功,是因为\\被解析成了字面量的\,.*又会匹配\后面的任意字符,自然能覆盖你的目标路径。
正确的写法有两种:
1. 完全转义反斜杠
把每个路径分隔的反斜杠都写成\\\\:
MATCH (n)-[r]->(m) WHERE r.TargetObject=~'hklm\\\\software\\\\microsoft\\\\windows\\\\currentversion\\\\run.*' RETURN n, r, m
2. 用字符类简化转义
在正则的字符类里,反斜杠只需要在Cypher里转义一次,用[\\]表示字面量的\,写法更简洁:
MATCH (n)-[r]->(m) WHERE r.TargetObject=~'hklm[\\]software[\\]microsoft[\\]windows[\\]currentversion[\\]run.*' RETURN n, r, m
这两种写法都能让正则引擎正确识别路径里的反斜杠,从而匹配到你想要的TargetObject。
内容的提问来源于stack exchange,提问作者Koh
相关产品推荐
相关产品推荐

