首页 > 解决方案 > 带下划线的特殊字符(postgres 中的正则表达式)

问题描述

如何识别正则表达式模式,包括 Postgres 中的下划线?

这是我的实际正则表达式:

[^\w]+

它很好地匹配字符,问题在于下划线。例如,当我使用该正则表达式调用函数时:

select regexp_replace('hello_world!', '[^\w]+', ' ', 'g')

我期待着hello world。如何匹配下划线?

标签: regexpostgresql

解决方案


问题是也\w匹配下划线,当您在否定字符类中使用它时,模式与_字符不匹配。您可以检查类速记转义表

\w   [[:alnum:]_](注意包括下划线)

要删除除字母数字以外的所有字符,您可以取出_并使用

select regexp_replace('hello_world!', '[^[:alnum:]]+', ' ', 'g')

在这里,[^[:alnum:]]+匹配一个或多个 ( +) 连续字符,而不是 ([^...]是一个否定的括号表达式) 字母和数字([:alnum:]POSIX 字符类匹配字母和数字)。

在此处输入图像描述

好吧,你不妨使用(?:\W|_)+. 不幸的是,一个常见的正则表达式构造 like[\W_]+将不起作用,因为\W(以及其他否定的速记,例如\Sand\D是非法的内括号表达式。更多详细信息可在手册中找到:

在括号表达式中,\d, \s, and\w丢失了它们的外括号, and \D, \S, and\W是非法的。(因此,例如,[a-c\d]等价于[a-c[:digit:]]。此外,[a-c\D]等价于[a-c^[:digit:]]的 是非法的。)

要摆脱产生的尾随/前导空格,您可以使用trim

select trim(regexp_replace('hello_world!', '[^[:alnum:]]+', ' ', 'g'))

推荐阅读