我开始使用Postgre Regular Expressions,开发PostgreSQL 8.3版本。
我有一张记录表如下:
record
-----------
a
ab
abc
123abc
132abc
123ABC
abc123
4567
5678
6789
我正在阅读一个简单的教程: www.oreillynet.com。 在我遇到以下问题之前,一切似乎都很清楚:
SELECT record FROM myrecords WHERE record ~ '[^0-9]';
tutorail说:
此表达式返回不包含数字的字符串。
但它在输出后返回给我:
output
------
a
ab
abc
123abc
132abc
123ABC
abc123
有人能解释一下这种行为吗?然后,我正在努力寻找该网站上的另一个表达式,试图在同一个字符串中排除包含数字和小写字母的字符串。
答案 0 :(得分:11)
此命令:
SELECT record FROM myrecords WHERE record ~ '[^0-9]';
表示在record
字段中应至少有一个非数字字符(这是正则表达式的含义)。
如果查找包含数字和小写字母的记录,那么我会期待一个正则表达式:
SELECT record FROM myrecords WHERE record ~ '[0-9a-z]';
将返回具有至少一个字母或数字或小写字母的所有记录。
如果您想获取没有数字的记录,那么您必须使用以下正则表达式:
SELECT record FROM myrecords WHERE record ~ '^[^0-9]+$';
这里,方括号外的^
字符表示字段的开头,$
字符表示字段的结尾,我们要求中间的所有字符都是非数字。 +
表示至少应该有一个这样的字符。如果我们还允许空字符串,则正则表达式看起来像^[^0-9]*$
。
答案 1 :(得分:2)
另一个简单的解决方案:
SELECT record FROM myrecords WHERE record !~ '[0-9]';
答案 2 :(得分:1)
select 'a2' ~ '^[a-z]+$'; --false
select 'a' ~ '^[a-z]+$'; --true
'^[a-z]+$'
=>仅检查从字符串开头(^)到字符串结尾(+ $)的字母a-z
如果要检查数字:'^[0-9]+$'
如果要检查数字和字符,请说“”。 :'^[0-9\.]+$'
,其中“ \”是转义字符