Cypher查询正则表达式

时间:2014-09-18 09:27:37

标签: regex neo4j cypher

我正在尝试匹配Neo4j数据库中的节点。节点有一个名为“name”的属性,我在Cypher中使用正则表达式来匹配它。我只想匹配整个单词,所以如果我提供字符串“java”,“javascript”应该不匹配。如果要匹配的字符串是多个单词,即“java script”,我将执行两个单独的查询,一个用于“java”,一个用于“script”。

这是我到目前为止所做的:

match (n) where n.name =~ '(?i).*\\bMYSTRING\\b.*' return n

这样可行,但它不适用于某些特殊字符,如“+”或“#”。所以我无法搜索“C ++”或“C#”等。上面代码中的正则表达式只是使用\ b作为字边界。它也是逃避它,所以它正常工作。

我尝试过这篇文章的某些版本:regex to match word boundary beginning with special characters但它确实没用,也许我做错了。

如何使用Cypher和Neo4j中的特殊字符进行此操作?

2 个答案:

答案 0 :(得分:3)

尝试转义特殊字符并查找非字字符而不是字边界。例如;

match (n) where n.name =~ '(?i).*(?:\\W|^)C\\+\\+(?:\\W|$).*' return n

虽然这仍然有一些误报,例如上面的内容将匹配“c +++”。

对于“非单词字符,除了我们要将+视为单词字符”之外,以下内容可以正常工作。

match (n) where n.name =~ '(?i).*(?:[\\W-[+]]|^)C\\+\\+(?:[\\W-[+]]|$).*' return n

虽然所有正则表达式都不支持,但我不确定Neo4j是否支持此功能。

答案 1 :(得分:1)

你可以在你的匹配之前和之后断言白色空格(或根本没有 - 匹配的边界),而不是断言单词边界。见:

(?i).*(?<!\\S)MYSTRING(?!\\S).*

在这里,你可以摆弄regex demo。它只会匹配你的字符串,如果它在你的单词之前和之后的空格或边界之间。你可以定义&#34;标点符号&#34;如果你需要,像这样:

(?i).*(?<![^\\s.,$])MYSTRING(?![^\\s.,$]).*
               ^^^  add boundaries  ^^^

然后它也会匹配rawrssss MYSTRING. dd

查看regex demo