如何在 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 中的匹配字符串为:
- "This is a new and intermediate art work"
- "This is an intermediate and new piece of art"
不匹配将是:
- "This is new art"
- "This is intermediate art"
请注意单词的顺序并不重要,只要两者都存在即可。此外,任何一个词都可以有一个标点符号——(逗号或句点)——紧跟在词之后(没有 space)。
我的第一个建议是将昂贵的正则表达式拆分为两个 SQL WHERE 子句和:
- 用 LIKE 匹配,因为它快得多,您可以在代码中过滤以获得更具体的匹配,
- 或与简单的正则表达式匹配,例如 '\m$1[\M,.]'
关于您使用的正则表达式:
- 我有一段时间没有使用它了,但我认为你需要括号来进行字符串连接
~* ( '^(?=.*\m' || 'new' || '\M)(?=.*\mintermediate\M)' )
在 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 中的匹配字符串为:
- "This is a new and intermediate art work"
- "This is an intermediate and new piece of art"
不匹配将是:
- "This is new art"
- "This is intermediate art"
请注意单词的顺序并不重要,只要两者都存在即可。此外,任何一个词都可以有一个标点符号——(逗号或句点)——紧跟在词之后(没有 space)。
我的第一个建议是将昂贵的正则表达式拆分为两个 SQL WHERE 子句和:
- 用 LIKE 匹配,因为它快得多,您可以在代码中过滤以获得更具体的匹配,
- 或与简单的正则表达式匹配,例如 '\m$1[\M,.]'
关于您使用的正则表达式:
- 我有一段时间没有使用它了,但我认为你需要括号来进行字符串连接
~* ( '^(?=.*\m' || 'new' || '\M)(?=.*\mintermediate\M)' )