如何用正则表达式模式识别Postgres中的下划线?
这是我的实际正则表达式:
[^\w]+
它可以很好地匹配字符,下划线有问题。例如,当我使用该正则表达式调用函数时:
select regexp_replace('hello_world!', '[^\w]+', ' ', 'g')
我期望hello world
。如何匹配下划线?
答案 0 :(得分:5)
问题在于\w
也与下划线匹配,并且在否定的字符类中使用它时,该模式与_
字符不匹配。您可以检查class-shorthand escape table:
\w
[[:alnum:]_]
(包括下划线)
要删除字母数字以外的所有字符,您可以取出_
并使用
select regexp_replace('hello_world!', '[^[:alnum:]]+', ' ', 'g')
此处,[^[:alnum:]]+
匹配一个或多个(+
)连续字符,而不是([^...]
是一个否定的括号表达式)字母和数字([:alnum:]
POSIX字符类匹配字母和数字)。
好吧,您最好使用(?:\W|_)+
。不幸的是,像[\W_]+
这样的常规正则表达式构造无法使用,因为\W
(以及\S
和\D
等其他取反的速记在方括号表达式中都是非法的。有关更多详细信息,请参见manual:
在方括号表达式中,
\d
,\s
和\w
失去了右方括号,而\D
,\S
和\W
非法。 (因此,例如,[a-c\d]
等同于[a-c[:digit:]]
。此外,等同于[a-c\D]
的{{1}}是非法的。)
要摆脱由此产生的结尾/前导空格,可以使用[a-c^[:digit:]]
:
trim