Специальные символы с подчеркиванием (регулярное выражение в postgres) - PullRequest
2 голосов
/ 22 марта 2019

Как распознать с помощью регулярных выражений, включая подчеркивание в Postgres?

Это мое настоящее регулярное выражение:

[^\w]+

Это соответствует символам хорошо, проблема с подчеркиванием. Когда я вызываю функцию с этим регулярным выражением, например:

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

Я ожидаю hello world. Как подбирать подчеркивание?

1 Ответ

5 голосов
/ 22 марта 2019

Проблема в том, что \w также соответствует подчеркиванию, и когда вы используете его в классе символов с отрицанием, шаблон не соответствует символам _. Вы можете проверить управляющую таблицу для стенографии :

\w [[:alnum:]_] (примечание подчеркивание включено)

Чтобы удалить все символы, кроме буквенно-цифровых, вы можете извлечь _ и использовать

select regexp_replace('hello_world!', '[^[:alnum:]]+', ' ', 'g')

Здесь [^[:alnum:]]+ соответствует одному или нескольким (+) последовательным символам, отличным от ([^...] - выражение в скобках с отрицанием) букв и цифр ([:alnum:] Класс символов POSIX соответствует буквам и цифрам).

enter image description here

Ну, вы могли бы также использовать (?:\W|_)+. К сожалению, обычная конструкция регулярного выражения, такая как [\W_]+, не будет работать, потому что \W (и другие отрицательные сокращения, такие как \S и \D, являются недопустимыми внутри скобочных выражений. Более подробная информация доступна в руководстве :

В выражениях в скобках \d, \s и \w теряют свои внешние скобки, а \D, \S и \W являются недопустимыми. (Так, например, [a-c\d] эквивалентно [a-c[:digit:]]. Также, [a-c\D], что эквивалентно [a-c^[:digit:]], является недопустимым.)

Чтобы избавиться от конечных / ведущих пробелов, вы можете использовать trim:

select trim(regexp_replace('hello_world!', '[^[:alnum:]]+', ' ', 'g'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...