Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
regexp\u replace中的regex求值似乎不正确_Regex_Postgresql - Fatal编程技术网

regexp\u replace中的regex求值似乎不正确

regexp\u replace中的regex求值似乎不正确,regex,postgresql,Regex,Postgresql,我刚刚偶然发现了regexp\u replacePostgreSQL函数的一个奇怪行为。这看起来像一只虫子,但我总是先怀疑自己。当我跑的时候 SELECT regexp_replace(E'1%2_3', '([_%])', E'\\ \\1', 'g') 它正确地在下划线或百分比前面加上反斜杠+空格,并生成“1\%2\\u 3”。但是,当我删除空格时(它不一定是空格,可以是任何字符) 它停止使用捕获的括号表达式进行替换,并生成“1\12\13”而不是“1\%2\\u3”。如果有人能告诉我我做

我刚刚偶然发现了
regexp\u replace
PostgreSQL函数的一个奇怪行为。这看起来像一只虫子,但我总是先怀疑自己。当我跑的时候

SELECT regexp_replace(E'1%2_3', '([_%])', E'\\ \\1', 'g')
它正确地在下划线或百分比前面加上反斜杠+空格,并生成“
1\%2\\u 3
”。但是,当我删除空格时(它不一定是空格,可以是任何字符)

它停止使用捕获的括号表达式进行替换,并生成“
1\12\13
”而不是“
1\%2\\u3
”。如果有人能告诉我我做错了什么,我将不胜感激。我只需要在字符串中的某些字符之前添加反斜杠

更新:我通过运行

SELECT regexp_replace(E'1%2_3', '([_%])', E'\\\\\\1', 'g')

我最初的例子似乎仍然有点不合逻辑和不一致。不一致之处在于,使用相同的
E'…'
语法4反斜杠可能会产生不同的结果。

在第二次查询中,在字符串级别处理反斜杠转义后,您拥有替换字符串
\\1

发生的情况是,转义的反斜杠阻止
\1
被识别为反向引用。您需要另一组反斜杠,以便替换字符串为
\\\1
,以获得文字反斜杠和反引用。因为每个反斜杠都需要转义,所以您需要将所有反斜杠加倍

SELECT regexp_replace(E'1%2_3', '([_%])', E'\\\\\\1', 'g')

在第二个查询中,在字符串级别处理反斜杠转义后,您有了替换字符串
\\1

发生的情况是,转义的反斜杠阻止
\1
被识别为反向引用。您需要另一组反斜杠,以便替换字符串为
\\\1
,以获得文字反斜杠和反引用。因为每个反斜杠都需要转义,所以您需要将所有反斜杠加倍

SELECT regexp_replace(E'1%2_3', '([_%])', E'\\\\\\1', 'g')

我不会在没有必要的情况下在Postgres中使用过时的Posix转义语法。您运行的版本是否过时,且
标准\u一致性\u strings=off
?因为如果您不是,请简化:

SELECT regexp_replace('1%2_3', '([_%])', '\\\1', 'g')
您只需添加一个
\
,就可以避开regexp模式中
\
的特殊含义

必须对前缀为
E
的字符串进行处理,这会增加一点点额外成本,而且使用特殊字符时总是存在意外副作用的风险。为希望按原样提供的字符串编写
E'1%2\u 3'
是毫无意义的。在任何情况下,都要做到“1%2\u 3”


仅需两个字符即可代替简单使用:

SELECT replace(replace('1%2_3', '_', '\_'), '%', '\%')

正则表达式功能强大,但需要付出代价。即使是几个嵌套的simple
replace()
调用也比单个
regexp\u replace()

便宜,我不会在Postgres中使用过时的Posix转义语法,而一开始就不需要。您运行的版本是否过时,且
标准\u一致性\u strings=off
?因为如果您不是,请简化:

SELECT regexp_replace('1%2_3', '([_%])', '\\\1', 'g')
您只需添加一个
\
,就可以避开regexp模式中
\
的特殊含义

必须对前缀为
E
的字符串进行处理,这会增加一点点额外成本,而且使用特殊字符时总是存在意外副作用的风险。为希望按原样提供的字符串编写
E'1%2\u 3'
是毫无意义的。在任何情况下,都要做到“1%2\u 3”


仅需两个字符即可代替简单使用:

SELECT replace(replace('1%2_3', '_', '\_'), '%', '\%')

正则表达式功能强大,但需要付出代价。即使是几个嵌套的simple
replace()
调用也比单个
regexp\u replace()便宜

谢谢Barmar,我是在做了几次实验后才发现这个问题的Hanks Barmar我是在做了几次实验后才发现这个问题的。我以前对regex vs replace有过这样的想法,但没有给它太多的意义。谢谢我以前有过关于regex vs replace的想法,但没有给它太多的意义。谢谢