如何在 PostgreSQL 中创建通用正则表达式 (POSIX)?

How to create a generalized regex (POSIX) in PostgreSQL?

在 postgreSQL (9.5),PgAdmin III 中,我想将这个 POSIX 语句概括为两个词:

这适用于单词 'new' 和 'intermediate' 的单词边界:

select * from cpt where cdesc ~* '^(?=.*\mnew\M)(?=.*\mintermediate\M)'

失败("where" 参数被视为文本字符串):

select * from cpt where cdesc ~* '^(?=.*\m'||'new'||'\M)(?=.*\mintermediate\M)'

泛化函数怎么写,例如:

CREATE OR REPLACE FUNCTION getDesc(string1 text, string2 text)
  RETURNS SETOF cpt AS
$BODY$ 

select * from cpt where cdesc ~* '^(?=.*\m\M)(?=.*\m\M)'

$BODY$
  LANGUAGE sql VOLATILE;

(其中 $1 是字符串 1,$2 是字符串 2)

TIA

编辑。 cdesc 中的匹配字符串为:

不匹配将是:

请注意单词的顺序并不重要,只要两者都存在即可。此外,任何一个词都可以有一个标点符号——(逗号或句点)——紧跟在词之后(没有 space)。

我的第一个建议是将昂贵的正则表达式拆分为两个 SQL WHERE 子句和:

  • 用 LIKE 匹配,因为它快得多,您可以在代码中过滤以获得更具体的匹配,
  • 或与简单的正则表达式匹配,例如 '\m$1[\M,.]'

关于您使用的正则表达式:

  • 我有一段时间没有使用它了,但我认为你需要括号来进行字符串连接

~* ( '^(?=.*\m' || 'new' || '\M)(?=.*\mintermediate\M)' )