Postgres正则表达式:\ s和\ S和字符类的行为似乎是错误的

时间:2011-09-23 07:06:05

标签: regex postgresql

文档说\ s是空白而\ S不是空白。到目前为止,对正则表达式用户来说并不是什么新鲜事。

但是让我们检查一些返回值:

SELECT SUBSTRING('abc a c' FROM 'a\\sc');
'a c'

SELECT SUBSTRING('abc a c' FROM 'a[\\s]c'); -- Note the character class
'a c'

SELECT SUBSTRING('abc a c' FROM 'a\\Sc');
'abc'

SELECT SUBSTRING('abc a c' FROM 'a[\\S]c'); -- Note the character class
ERROR:  invalid regular expression: invalid escape \ sequence

所以看来,\ s可以在字符类中使用而\ S不能。为什么呢?

1 个答案:

答案 0 :(得分:8)

来自the manual

  

在括号表达式中,\ d,\ s和\ w会丢失其外括号,   和\ D,\ S和\ W是非法的。

在任何情况下,括号似乎都是多余的,因为\s\S本身就是字符类。

以下语法对我来说可以替代a[\\S]c

SELECT SUBSTRING('abc a c' FROM 'a[^[:space:]]c');