带下划线的特殊字符(PostgreSQL中的正则表达式)

3
如何在Postgres中识别包含下划线的正则表达式模式?
这是我的实际正则表达式:
[^\w]+

这个正则表达式可以匹配字符,但下划线会出现问题。例如,当我使用这个正则表达式调用函数时:

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

我期望输出 "hello world",如何同时匹配下划线?

“hello world”的结果?您是想删除“!”但替换“_”吗?还是您期望得到带有悬挂空格的“hello world ”? - Erwin Brandstetter
1个回答

7
问题在于\w也会匹配下划线,当你在否定字符类中使用它时,模式不会匹配_字符。您可以查看class-shorthand escape table

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

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

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

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

enter image description here

你最好使用(?:\W|_)+。不幸的是,像[\W_]+这样的常见正则表达式构造将无法工作,因为\W(以及其他否定的缩写,如\S\D)在方括号表示法中是非法的。有关详细信息,请参阅手册

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

为了消除结果的尾随/前导空格,您可以使用trim

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

1
手册:在括号表达式中,\d\s\w会失去它们的外部方括号,而 \D\S\W则是非法的。因此,[\W_]+无法使用。 - Erwin Brandstetter
根据个人喜好,可以使用 [^a-zA-Z0-9]+ 替代 [^[:alnum:]]+(长度相同)。 - David Faber
好的,我明白为什么我误解了那个手册上的一行。我会在答案中加上。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接