Postgres regex发行

Postgres regex发行,regex,postgresql,Regex,Postgresql,我需要查找存储在postgres中的所有记录,这些记录与以下regexp匹配: ^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$ 大概是这样的: SELECT * FROM users WHERE users.phone ~ '^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$' 但这一点是错误的: 无效的正则表达式:量词操作数无效 为什么博士后不使用这个正则表达式 在普通Ruby中使用

我需要查找存储在postgres中的所有记录,这些记录与以下regexp匹配:

^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$
大概是这样的:

SELECT * FROM users WHERE users.phone ~ '^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$'
但这一点是错误的:

无效的正则表达式:量词操作数无效

为什么博士后不使用这个正则表达式

在普通Ruby中使用相同的方法效果很好

更新

问题只是在哪里。当我尝试:

SELECT '+79637434199' ~ '^((8|\+7)[\- ]?)(\(?\d{3}\)?[\- ]?)[\d\- ]{7,10}'
Postgres返回true。但当我尝试时:

SELECT * FROM users WHERE users.phone ~ '^((8|\+7)[\- ]?)(\(?\d{3}\)?[\- ]?)[\d\- ]{7,10}'

结果:“无效的正则表达式:量词操作数无效”

将其放在字符类的第一个或最后一个位置时,不需要在字符类中转义
-
,因为这样就不会将其误读为范围:

[\-]
->
[-]

[\d\-]
->
[\d-]

按照你的方式,最后的上限
10
是徒劳的。
在末尾添加
$
以禁止尾随字符。
\D
禁止尾随数字(但需要非数字)。
($|\D)
将字符串结束在此处或具有非数字后跟

综合起来:

SELECT '+79637434199' ~ '^(8|\+7)[ -]?(\(?\d{3}\)?[ -]?)[\d -]{7,10}($|\D)'
否则,您的表达式很好,在PostgreSQL 9.1.4上对我很有效。无论您是在
WHERE
子句中还是在
SELECT
列表中使用它,都不会有任何区别,除非您遇到了某个旧版本的bug(如注释中建议的@kgrittn)


如果我在字符串文本前面加上
E
,就会引发您收到的错误消息。这无法解释您的问题,因为您声明表达式在
SELECT
item时工作正常

但是,正如福尔摩斯所言,“当你排除了不可能,剩下的无论多么不可能,都必须是真相。”

可能您运行了一个测试,另一个测试使用
standard\u compliance\u strings=off
——这是9.1之前旧版本中字符串文本的默认解释。可能有两个不同的客户端(具有不同的设置)


阅读本手册章节的更多内容。

这是什么版本的PostgreSQL?最近在正则表达式处理方面有一些修复,所以较小的版本号可能会很重要。