正则表达式返回转义字符

时间:2020-04-22 09:00:05

标签: sql regex oracle

是否可以使用正则表达式转义一组字符。

一个例子:

Input: name!surname
Output: name\!surname

这个想法是要转义所有非字母数字的字符,我知道如何编写一个正则表达式来查找它们,但真的很难转义。

通过REGEXP_REPLACE()使用Oracle的SQL:

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

输出看起来像跟随name#surname#,但我想知道是否有可能得到类似name\!surname\?的东西。

我需要转义所有非字母数字字符,以便Oracle Text解析查询。

我不能使用{}进行多次转义,因为它不适用于通配符%。

3 个答案:

答案 0 :(得分:2)

您可以在\1之前使用双反斜杠作为第三个参数,并与[^[:alnum:]] posix(正好在括号和括号之前的[:space:] posix一起使用,是因为避免了反斜杠的替换带有空格):

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

Demo

答案 1 :(得分:1)

将您要匹配的字符组包装到一个捕获组中,然后使用\\\1作为替换。 \\是转义的反斜杠,\1将插入第一个捕获组的内容:

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

输出:

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

db <>提琴here

答案 2 :(得分:1)

使用

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

请参见online demo,结果:

enter image description here

模式为([[:punct:]]),这是一个与单个标点或符号char匹配的单个捕获组。替换为反斜杠+组值。

请注意,替换模式中的\是一个特殊字符,它用于引入占位符替换后向引用,因此应自行转义在结果字符串中产生文字反斜杠。