全字正则表达式在Neo4j Embedded中不起作用

时间:2014-05-11 05:31:54

标签: java regex neo4j spring-data-neo4j

正则表达式非常简单:

WHERE t.name =~ "(?i).*\\baaaaaaaa\\b.*"

这适用于Neo4j服务器Web控制台。我收到了预期的结果。

当我通过Java使用REST接口时,我不得不将正则表达式更改为:"(?i).*\\\baaaaaaaa\\\b.*"(添加了反斜杠)。我不明白为什么,但它有效(再次返回预期的结果)。

同样的正则表达式不适用于嵌入式Neo4j:

Caused by: Invalid input '': expected '\', ''', '"', 'b', 'f', 'n', 'r', 't' or Unicode (line 1, column 64)
MATCH ... WHERE t.name =~ "(?i)\ aaaaaaaa\ " ...
                                ^

请注意,\b未显示在错误日志中(至少在Intellij控制台上)。

更糟糕的是"(?i).*\\baaaaaaaa\\b.*"在嵌入式服务器和服务器数据库上都被正确解析(至少没有抛出异常)。但是没有返回任何结果。

重要注意事项:

  • Neo4j 2.0
  • 我使用的是Spring Data(3.0)

1 个答案:

答案 0 :(得分:2)

尝试在所有3种情况下使用参数。然后它应该更加一致。

WHERE t.name =~ {regexp}


params: {regexp: "(?i).*\\baaaaaaaa\\b.*"}

当您在Java中使用JSON与文字字符串时发生的不同转义,以及Cypher解析器因此在工作中有2或3个不同的解析器,每个解析器都有自己对转义的理解。

在普通Java中,afaik是regexp的两个退格。