首页 > 解决方案 > 如何从 Postgres 中的模式搜索中忽略特定的单词或字符集

问题描述

我在 Postgres 11 中有下表。

col1
BI Placebo
BI 10773 Placebo
AMG 386 Placebo
Eflornithine or Placebo
Sulindac;Placebo
Sulindac plus Placebo
Vehicle Controlled Placebo

我想获取那些忽略了特定单词和特殊字符集并且字符串在模式前后有 1 个或多个的行。所需的输出是:

col1
BI Placebo
BI 10773 Placebo
AMG 386 Placebo
Vehicle Controlled Placebo

我尝试了以下查询来执行此操作:

select * from table where col1 ~* '^(?!or|;|+|plus)\w\s\w\sPlacebo$' or col1 ~* '^(?!or|;|+|plus)\w\sPlacebo$'

如果这不是一个复杂的查询,我很抱歉,但目前我无法逃避这些单词和字符。

标签: regexpostgresql

解决方案


如果只允许匹配单词字符,则可以省略匹配;+从交替中。请注意,您必须转义加号\+或将两者都添加到字符类[;+]

您可以检查字符串不包含orplus使用负前瞻(?!.*(?:or|plus))

然后匹配 1+ 单词字符使用\w+后跟可选匹配空格和 1+ 单词字符。

然后匹配Placebo字符串的末尾。

^(?!.*(?:or|plus))\w+(?: \w+)? Placebo$

正则表达式演示| Postgresql 演示

例如

select * from table where col1 ~* '^(?!.*(?:or|plus))\w+(?: \w+)? Placebo$'

输出

col1

BI Placebo
BI 10773 Placebo
AMG 386 Placebo
Vehicle Controlled Placebo

推荐阅读