Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 带正则表达式的密码查询_Regex_Neo4j_Cypher - Fatal编程技术网

Regex 带正则表达式的密码查询

Regex 带正则表达式的密码查询,regex,neo4j,cypher,Regex,Neo4j,Cypher,我正在尝试匹配Neo4j数据库中的节点。这些节点有一个名为“name”的属性,我在Cypher中使用正则表达式来匹配它。我只想匹配整个单词,所以如果我提供字符串“java”,则“javascript”不应该匹配。如果要匹配的字符串由多个单词组成,即“java脚本”,我将执行两个单独的查询,一个用于“java”,另一个用于“脚本” 这就是我到目前为止所做的: match (n) where n.name =~ '(?i).*\\bMYSTRING\\b.*' return n 这是可行的,但它不

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

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

match (n) where n.name =~ '(?i).*\\bMYSTRING\\b.*' return n
这是可行的,但它不适用于某些特殊字符,如“+”或“#”。因此,我无法搜索“C++”或“C#”等。上述代码中的正则表达式仅使用\b作为单词边界。它也在逃逸,以便正确工作

我试过这篇文章的一些版本:但它没有真正起作用,也许我做错了什么


如何使用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

尽管并非所有的regexp风格都支持这一点,我也不确定Neo4j是否支持这一点。

您可以在匹配前后声明空格(或完全不声明-匹配边界),而不是声明单词边界。见此:

(?i).*(?<!\\S)MYSTRING(?!\\S).*
(?i)。*(?
在这里,您可以摆弄一个。只有在字词前后的空格或边界之间,它才会与字符串匹配。如果需要,您可以定义“标点符号”,如下所示:

(?i).*(?<![^\\s.,$])MYSTRING(?![^\\s.,$]).*
               ^^^  add boundaries  ^^^
(?i)。*(?
然后它也将匹配
rawrsss MYSTRING.dd


请参见a!

这通常会起作用,但\b单词边界仅使用字母数字字符,因此它不匹配“c++”(以特殊字符开头或结尾)之类的属性。它将匹配“c++c”之类的属性,因为它以“c”结尾。这是可行的,但如果您在更新的答案中提到的字符串前后有字符,它也会匹配。有没有办法使它只匹配整个单词?更新的答案不是与“(?i)”相同吗?*C\\+\+.*”?@Y发现答案与“(?i)不同*c++.*',因为它将匹配C++ +c@ωyvIn,使它只在整字上匹配。你需要对整字的意思明确。ReGEX引擎将Word边界视为单词字符和非单词字符之间的边界,但这对你不起作用,因为你想把“C++”作为一个单词来处理。“\\W”与“\\s”一起查找空格旁边的匹配项。或与“”一起查找空格旁边的匹配项。或与符合条件的自定义字符组一起查找。好的,我的边界是空格,即分隔的单词。它按预期工作(通过有限测试)当我将\\W替换为\\s时。是否需要检查空格字符和空格,它们是不同的?