Allow complemented character class escapes within regex brackets.
Tom Lane <tgl@sss.pgh.pa.us>
Allow complemented character class escapes within regex brackets. The complement-class escapes \D, \S, \W are now allowed within bracket expressions. There is no semantic difficulty with doing that, but the rather hokey macro-expansion-based implementation previously used here couldn't cope. Also, invent "word" as an allowed character class name, thus "\w" is now equivalent to "[[:word:]]" outside brackets, or "[:word:]" within brackets. POSIX allows such implementation-specific extensions, and the same name is used in e.g. bash. One surprising compatibility issue this raises is that constructs such as "[\w-_]" are now disallowed, as our documentation has always said they should be: character classes can't be endpoints of a range. Previously, because \w was just a macro for "[:alnum:]_", such a construct was read as "[[:alnum:]_-_]", so it was accepted so long as the character after "-" was numerically greater than or equal to "_". Some implementation cleanup along the way: * Remove the lexnest() hack, and in consequence clean up wordchrs() to not interact with the lexer. * Fix colorcomplement() to not be O(N^2) in the number of colors involved. * Get rid of useless-as-far-as-I-can-see calls of element() on single-character character element names in brackpart(). element() always maps these to the character itself, and things would be quite broken if it didn't --- should "[a]" match something different than "a" does? Besides, the shortcut path in brackpart() wasn't doing this anyway, making it even more inconsistent. Discussion: https://postgr.es/m/2845172.1613674385@sss.pgh.pa.us Discussion: https://postgr.es/m/3220564.1613859619@sss.pgh.pa.us
Files
| Path | Change | +/− |
|---|---|---|
| doc/src/sgml/func.sgml | modified | +12 −13 |
| src/backend/regex/regc_color.c | modified | +30 −4 |
| src/backend/regex/regc_lex.c | modified | +16 −150 |
| src/backend/regex/regc_locale.c | modified | +51 −46 |
| src/backend/regex/regcomp.c | modified | +240 −45 |
| src/backend/regex/regc_pg_locale.c | modified | +9 −0 |
| src/backend/regex/re_syntax.n | modified | +4 −9 |
| src/include/regex/regguts.h | modified | +16 −4 |
| src/test/modules/test_regex/expected/test_regex.out | modified | +250 −0 |
| src/test/modules/test_regex/sql/test_regex.sql | modified | +44 −0 |
Documentation touched
Discussion
- Bizarre behavior of \w in a regular expression bracket construct 12 messages · 2021-02-20 → 2021-02-24
- Some regular-expression performance hacking 38 messages · 2021-02-11 → 2021-03-06