我正在尝试匹配 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 中使用特殊字符进行这项工作?
最佳答案
尝试转义特殊字符并查找非单词字符而不是单词边界。例如;
match (n) where n.name =~ '(?i).*(?:\\W|^)C\\+\\+(?:\\W|$).*' return n
虽然这仍然有一些误报,例如上面的将匹配“c+++”。
对于“非单词字符,除非我们想将 + 视为单词字符”,以下可以工作。
match (n) where n.name =~ '(?i).*(?:[\\W-[+]]|^)C\\+\\+(?:[\\W-[+]]|$).*' return n
尽管并非所有正则表达式都支持这一点,但我不确定 Neo4j 是否支持这一点。
关于regex - 使用正则表达式进行密码查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25908943/