2011-09-23 18 views
11

La documentación dice que \ s es un espacio en blanco y \ S no es un espacio en blanco. Hasta ahora, nada nuevo para los usuarios de regex.Postgres regex: Comportamiento de s y S y la clase de caracteres parece incorrecta

Pero vamos a ver algunos valores de retorno:

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 

por lo que parece, \ s se puede utilizar en una clase de caracteres y \ S no puede. ¿Por qué?

Respuesta

8

De the manual:

Dentro de expresiones con corchetes, \ d, \ s, y \ w perder sus soportes exteriores, y \ D, \ S, y \ W son ilegales.

En cualquier caso, los soportes parecer redundante, ya \s y \S mismos son clases de personajes.

La siguiente sintaxis funciona para mí como una alternativa a a[\\S]c:

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

Thx, que se pasa por alto esto. Por cierto, por supuesto, los corchetes son redundantes en mi código de ejemplo simplificado. – Leif

+0

La razón por la que son ilegales es porque 'a [^ \ s] c' funciona bien para la negación. – hhaamu

Cuestiones relacionadas