Регулярное выражение возвращает экранированный символ - PullRequest
1 голос
/ 22 апреля 2020

Можно ли избежать набора символов с помощью регулярного выражения.

Пример:

Input: name!surname
Output: name\!surname

Идея состоит в том, чтобы избежать всех не alphanumeri c символов, я знаю как написать регулярное выражение, чтобы найти их, но на самом деле изо всех сил пытаться убежать.

Использование Oracle SQL с REGEXP_REPLACE():

SELECT regexp_replace('name!surname?', '[^a-zA-Z\d\s:]', '#') from sys.dual;

Вывод будет выглядеть следующим образом name#surname# но я хотел бы знать, возможно ли получить что-то вроде name\!surname\?.

Мне нужно экранировать все символы не alphanumeri c для Oracle Text для анализа запроса.

Я не могу использовать {} для мульти-экранирования, так как он не работает с подстановочным знаком%.

Ответы [ 3 ]

2 голосов
/ 22 апреля 2020

Вы можете использовать двойную обратную косую черту sh перед \1 в качестве третьего аргумента вместе с [^[:alnum:]] posix (posix [:space:] непосредственно перед закрывающей скобкой и круглыми скобками должен избавить от замены backsla sh с пробелами):

select regexp_replace('name!surname','([^[:alnum:][:space:]])','\\\1') 
  from dual

Демо

1 голос
/ 22 апреля 2020

Использование

SELECT REGEXP_REPLACE('name!surname','([[:punct:]])','\\\1') from dual

См. онлайн-демонстрацию , результат:

enter image description here

Шаблон ([[:punct:]]), единственная группа захвата, которая соответствует единственной пунктуации или символу char. Замена представляет собой обратную косую черту sh + значение группы.

Обратите внимание, что \ в шаблоне замены является специальным символом, он используется для введения заполнителей , замены обратные ссылки , следовательно, он должен быть экранирован сам для получения литерального обратного слова sh в результирующей строке.

1 голос
/ 22 апреля 2020

Оберните группу символов, которую вы пытаетесь сопоставить, в группу захвата, а затем используйте \\\1 в качестве замены. \\ является экранированным обратным символом sh, и \1 вставит содержимое первой группы захвата:

SELECT regexp_replace('name! surname?', '([^a-zA-Z0-9[:space:]:])', '\\\1')
       AS replacement
from sys.dual;

Выходы:

| REPLACEMENT     |
| :-------------- |
| name\!surname\? |

дБ <> скрипка здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...