我正在尝试匹配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中的特殊字符进行此操作?
答案 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!