我在找
“家庭医学博士”(2004 年)
之后有任何东西。我试过 where id~'"House M\.D\." \(2004\).*';
了,没有匹配
这有效id~'.*House M.D..*2004.*';
,但有点慢。
我在找
“家庭医学博士”(2004 年)
之后有任何东西。我试过 where id~'"House M\.D\." \(2004\).*';
了,没有匹配
这有效id~'.*House M.D..*2004.*';
,但有点慢。
我怀疑您使用的是较旧的 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_strings
为on
;请参阅文档。
您应该在测试代码后在旧版本中打开它,因为它会使以后的更新更加容易。您可以在全局postgresql.conf
、在每个用户级别上使用ALTER ROLE ... SET
、在每个数据库级别上使用ALTER DATABASE ... SET
或在会话级别上使用SET standard_conforming_strings = 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;
$$
测试:
SELECT regexp_quote('"House M.D." (2004)'); -- produces: "House M\\.D\\." \\(2004\\)