2

我在找

“家庭医学博士”(2004 年)

之后有任何东西。我试过 where id~'"House M\.D\." \(2004\).*';了,没有匹配

这有效id~'.*House M.D..*2004.*';,但有点慢。

4

3 回答 3

4

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

根据字符串常量的词法结构文档,您可以:

  • 确保standard_conforming_strings打开,在这种情况下,您必须将任何单引号加倍(即'变为'')但反斜杠不被视为转义:

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

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

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

PostgreSQL 9.1 及以上版本默认设置standard_conforming_stringson;请参阅文档

您应该在测试代码后在旧版本中打开它,因为它会使以后的更新更加容易。您可以在全局postgresql.conf、在每个用户级别上使用ALTER ROLE ... SET、在每个数据库级别上使用ALTER DATABASE ... SET或在会话级别上使用SET standard_conforming_strings = on。用于SET LOCAL在事务范围内设置它。

于 2012-10-13T11:20:18.023 回答
2

看起来你的正则表达式没问题

http://sqlfiddle.com/#!12/d41d8/113

于 2012-10-13T11:15:35.200 回答
0
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; 
$$ 

测试:

SELECT regexp_quote('"House M.D." (2004)'); -- produces: "House M\\.D\\." \\(2004\\)
于 2012-10-13T15:27:45.473 回答