我的Postgresql数据库中有一个文本字段,我只想存储数字字符和特殊字符,如'-'和'.',我必须从数据库中删除所有包含字母的行。我该如何做到这一点,即找到指定字段中包含字母的所有行?
chhqkbe11#
使用PostgreSQL Regex。该代码必须解决您的问题。
select * from your_table where (column_text ~* '[a-z]') is false
~*匹配不区分大小写的正则表达式,并且[a-z]表示从a到z的所有字母。
~*
[a-z]
cqoc49vn2#
要匹配任何Unicode字母,可以使用x1m2 n1,,而不是[a-z]或[A-Za-z]:
[A-Za-z]
select * from your_table where (column_text ~* '[[:alpha:]]') is false
[:alpha:]是一个POSIX字符类,它可以匹配任何Unicode字母。它很方便,因为PostgreSQL regex不支持\p{L}或\p{Alphabetic}等Unicode类别类。参见 *9.7.3.2.括号表达式 *:在方括号表达式中,用[:和:]括起来的字符类名称代表属于该类的所有字符的列表。字符类不能用作范围的端点。POSIX标准定义了这些字符类名称:alnum(字母和数字),alpha(字母),blank(空格和制表符),cntrl(控制字符),digit(数字),graph(除空格外的可打印字符),lower(小写字母),print(可打印字符,包括空格),punct(标点符号),space(任何白色),upper(大写字母),和xdigit(十六进制数字)。对于7位ASCII集中的字符,这些标准字符类的行为通常跨平台一致。给定的非ASCII字符是否被视为属于这些类之一取决于用于正则表达式函数或运算符的归类(参见第24.2节),缺省情况下,根据数据库的LC_CTYPE语言环境设置非ASCII字符的分类在不同的平台上会有所不同,即使在名称相似的语言环境中也是如此。(但是C语言环境从不认为任何非ASCII字符属于这些类中的任何一个。)除了这些标准字符类之外,PostgreSQL还定义了word字符类,与alnum加上下划线(_)字符相同;以及ascii字符类,正好包含7位ASCII集。
[:alpha:]
\p{L}
\p{Alphabetic}
[:
:]
alnum
alpha
blank
cntrl
digit
graph
lower
print
punct
space
upper
xdigit
word
_
ascii
2条答案
按热度按时间chhqkbe11#
使用PostgreSQL Regex。该代码必须解决您的问题。
~*
匹配不区分大小写的正则表达式,并且[a-z]
表示从a到z的所有字母。cqoc49vn2#
要匹配任何Unicode字母,可以使用x1m2 n1,,而不是
[a-z]
或[A-Za-z]
:[:alpha:]
是一个POSIX字符类,它可以匹配任何Unicode字母。它很方便,因为PostgreSQL regex不支持\p{L}
或\p{Alphabetic}
等Unicode类别类。参见 *9.7.3.2.括号表达式 *:在方括号表达式中,用
[:
和:]
括起来的字符类名称代表属于该类的所有字符的列表。字符类不能用作范围的端点。POSIX标准定义了这些字符类名称:alnum
(字母和数字),alpha
(字母),blank
(空格和制表符),cntrl
(控制字符),digit
(数字),graph
(除空格外的可打印字符),lower
(小写字母),print
(可打印字符,包括空格),punct
(标点符号),space
(任何白色),upper
(大写字母),和xdigit
(十六进制数字)。对于7位ASCII集中的字符,这些标准字符类的行为通常跨平台一致。给定的非ASCII字符是否被视为属于这些类之一取决于用于正则表达式函数或运算符的归类(参见第24.2节),缺省情况下,根据数据库的LC_CTYPE语言环境设置非ASCII字符的分类在不同的平台上会有所不同,即使在名称相似的语言环境中也是如此。(但是C语言环境从不认为任何非ASCII字符属于这些类中的任何一个。)除了这些标准字符类之外,PostgreSQL还定义了word
字符类,与alnum
加上下划线(_
)字符相同;以及ascii
字符类,正好包含7位ASCII集。