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

时间:2019-03-22 14:31:32

标签: regex postgresql

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

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

[^\w]+

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

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

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

1 个答案:

答案 0 :(得分:5)

问题在于\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等其他取反的速记在方括号表达式中都是非法的。有关更多详细信息,请参见manual

  

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

要摆脱由此产生的结尾/前导空格,可以使用[a-c^[:digit:]]

trim