Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Sql 如何避开这个正则表达式?_Sql_Regex_Postgresql - Fatal编程技术网

Sql 如何避开这个正则表达式?

Sql 如何避开这个正则表达式?,sql,regex,postgresql,Sql,Regex,Postgresql,我在找 “众议院医学博士”(2004年) 之后还有什么。我试过where id~“'House M\.D\.”(2004\).*”并且没有匹配项 这项工程id~'.*House M.D..*2004.''但是有点慢。看起来您的regexp还可以 我怀疑您使用的是较旧的PostgreSQL版本,默认情况下,该版本以不符合标准的C-escape-like模式解释字符串,因此反斜杠被视为转义符并被使用。尝试设置标准字符串='on' 根据有关字符串常量的文档,您可以: 确保标准字符串处于启用状态,在这

我在找

“众议院医学博士”(2004年)

之后还有什么。我试过
where id~“'House M\.D\.”(2004\).*”并且没有匹配项


这项工程
id~'.*House M.D..*2004.''但是有点慢。

看起来您的regexp还可以


我怀疑您使用的是较旧的PostgreSQL版本,默认情况下,该版本以不符合标准的C-escape-like模式解释字符串,因此反斜杠被视为转义符并被使用。尝试设置标准字符串='on'

根据有关字符串常量的文档,您可以:

  • 确保
    标准字符串
    处于启用状态,在这种情况下,必须将任何单引号加倍(即
    变为
    ),但反斜杠不被视为转义符:

    id~''House M\.D\.“\(2004\)”

  • 使用非标准的、特定于PostgreSQL的
    E'
    语法,并将反斜杠加倍:

    id~E''House M\\.D\.\\\\(2004\\)'

默认情况下,PostgreSQL 9.1及以上版本将
标准字符串设置为
上的
;看

您应该在测试代码后在旧版本中启用它,因为它将使以后的更新更加容易。您可以在
postgresql.conf
中全局打开它,在每个用户级别使用
alterrole。。。使用ALTER database在每个数据库级别上设置
。。。设置
或在会话级别上使用
设置符合标准的字符串=on
。使用
SET LOCAL
将其设置在事务范围内

CREATE OR REPLACE FUNCTION public.regexp_quote(IN TEXT) 
  RETURNS TEXT 
  LANGUAGE plpgsql 
  STABLE 
AS $$ 
/******************************************************************************* 
 * Function Name: regexp_quote 
 * In-coming Param: 
 *   The string to decoded and convert into a set of text arrays. 
 * Returns: 
 *   This function produces a TEXT that can be used as a regular expression 
 *   pattern that would match the input as if it were a literal pattern. 
 * Description: 
 *   Takes in a TEXT in and escapes all of the necessary characters so that 
 *   the output can be used as a regular expression to match the input as if 
 *   it were a literal pattern. 
 ******************************************************************************/ 
BEGIN 
  RETURN REGEXP_REPLACE($1, '([[\\](){}.+*^$|\\\\?-])', '\\\\\\1', 'g'); 
END; 
$$ 
测试:


在任何问题中都应该包括PostgreSQL版本。这是非常特定于版本的。@CraigRinger很抱歉速度太慢,但我如何找到它?
SELECT version()。每次启动
psql
,它都会打印出来,显示在PgAdmin III中,显示在程序包列表/已安装程序列表中,等等。是的,这就是我在回答中所说的。只是指出问题不在于regexp,而在于OP使用的是Pg 9.0或更老版本,没有
标准一致性字符串
,并且不允许字符串文本解析使用反斜杠。
SELECT regexp_quote('"House M.D." (2004)'); -- produces: "House M\\.D\\." \\(2004\\)