我将电子邮件地址存储在我尝试匹配的某些用户节点中,但是(?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)
,但也没有运气。有什么想法吗?
答案 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
返回所需的结果。