我需要找到存储在postgres中的所有记录,这些记录与以下regexp匹配:
^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$
Run Code Online (Sandbox Code Playgroud)
像这样:
SELECT * FROM users WHERE users.phone ~ '^((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}$'
Run Code Online (Sandbox Code Playgroud)
但这是错误的:
正则表达式无效:量词操作数无效
为什么Postgres不能使用此正则表达式?
在普通的Ruby中使用相同的代码就可以了。
更新
问题仅在于WHERE。当我尝试:
SELECT '+79637434199' ~ '^((8|\+7)[\- ]?)(\(?\d{3}\)?[\- ]?)[\d\- ]{7,10}'
Run Code Online (Sandbox Code Playgroud)
Postgres返回true。但是当我尝试:
SELECT * FROM users WHERE users.phone ~ '^((8|\+7)[\- ]?)(\(?\d{3}\)?[\- ]?)[\d\- ]{7,10}'
Run Code Online (Sandbox Code Playgroud)
结果:“无效的正则表达式:限定符操作数无效”。
将-字符放在第一个或最后一个位置时,无需在字符类中进行转义,因为这样不会误读为范围:
[\- ]-> [- ]
[\d\- ]->[\d -]
最终的上限方式10是徒劳的。在末尾
添加$以禁止尾随字符。
或\D不允许尾随数字(但要求非数字)。
或者($|\D)在该处将字符串结尾或跟随一个非数字。
放在一起:
SELECT '+79637434199' ~ '^(8|\+7)[ -]?(\(?\d{3}\)?[ -]?)[\d -]{7,10}($|\D)'
Run Code Online (Sandbox Code Playgroud)
否则,您的表达式就可以了,并且可以在PostgreSQL 9.1.4上使用。无论是在WHERE子句中还是在SELECT列表中使用它,都不会有任何区别-除非您遇到某个旧版本的错误(如注释中建议的@kgrittn)。
如果我在字符串文字前加上E,则可以引发您收到的错误消息。这不能解释您的问题,因为您表示该表达式可以很好地用作SELECT项目。
但是,正如《福尔摩斯》所引述的那样,“当您排除了不可能的事情时,无论多么不可能的事情,剩下的都是事实。”
也许您使用进行了一项测试,standard_conforming_strings = on而另一项进行了测试standard_conforming_strings = off-这是9.1之前的旧版本中字符串文字的默认解释。也许有两个不同的客户端(对此有不同的设置)。
在手册中的“使用C样式转义的字符串常量 ”一章中阅读更多内容。
| 归档时间: |
|
| 查看次数: |
7284 次 |
| 最近记录: |