Neo4j中的符号不​​区分大小写的正则表达式

时间:2015-06-10 08:05:07

标签: regex neo4j cypher

我将电子邮件地址存储在我尝试匹配的某些用户节点中,但是(?i)不区分大小写的选项在添加+时似乎不起作用在邮件地址。我使用这些来测试,例如john+business@doe.com

设置测试节点:

CREATE (uWithoutSymbol:USER {
    email: 'john@doe.com'
})
CREATE (uWithSymbol:USER {
    email: 'john+business@doe.com'
})

Cypher查询:

MATCH (u:USER)
// This works
WHERE u.email =~ '(?i)john@doe.com'
RETURN u

MATCH (u:USER)
// This returns nothing
WHERE u.email =~ '(?i)john+business@doe.com'
RETURN u

我尝试使用不区分大小写的unicode one:(?ui),但也没有运气。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

加号' +'在正则表达式中有特殊意义;逃避它:

WHERE u.email =~ '(?i)john\\+business@doe.com'

加号表示"前一个字词中的一个或多个",因此您的尝试将与"johnbusiness@doe.com""johnnnnbusiness@doe.com"匹配。

从技术上讲,你也应该逃避点:

WHERE u.email =~ '(?i)john\\+business@doe\.com'

因为没有转义点,它会匹配那里的任何字符,例如它也匹配"john+business@doeAcom""john+business@doe#com"

感谢@Stefan指出为正则表达式创建单个字面反斜杠所需的双反斜杠

答案 1 :(得分:2)

@ Bohemian的答案解决了这个问题:你需要引用+。但在Cypher中,反斜杠需要重复:

MATCH (u:USER)
WHERE u.email =~ '(?i)john\\+business@doe.com'
RETURN u

返回所需的结果。