是否可以使用正则表达式转义一组字符。
一个例子:
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解析查询。
我不能使用{}进行多次转义,因为它不适用于通配符%。
答案 0 :(得分:2)
您可以在\1
之前使用双反斜杠作为第三个参数,并与[^[:alnum:]]
posix(正好在括号和括号之前的[:space:]
posix一起使用,是因为避免了反斜杠的替换带有空格):
select regexp_replace('name!surname','([^[:alnum:][:space:]])','\\\1')
from dual
答案 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,结果:
模式为([[:punct:]])
,这是一个与单个标点或符号char匹配的单个捕获组。替换为反斜杠+组值。
请注意,替换模式中的\
是一个特殊字符,它用于引入占位符,替换后向引用,因此应自行转义在结果字符串中产生文字反斜杠。