如果postgres 11中的模式前后有/are'n'word/s,则提取行

xpszyzbs  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(244)

我在博士后有下表

col1        col2            col3
NCT00000412 Drug            Placebo Calcitriol
NCT00000412 Drug            Placebo Alendronate
NCT00000774 Biological      Placebo version of rgp120/HIV-1MN
NCT00000774 Biological      Placebo version of rgp120/HIV-1SF2
NCT00005648 Drug            Gemcitabine with Placebo
NCT00007631 Drug            Tretinoin 0.1% cream or placebo
NCT00007735 Drug            Doxycycline (200mg/day) or Placebo
NCT00032435 Drug            PAL-40 Placebo
NCT00032435 Drug            abciximab placebo; reteplase placebo, abciximab  
NCT00032435 Drug            Valsartan placebo + nateglinide placebo

我试图提取那些单词前后只有一个单词的行。预期输出为:

col1        col2    col3
NCT00000412 Drug    Placebo Calcitriol
NCT00000412 Drug    Placebo Alendronate
NCT00032435 Drug    PAL-40 Placebo

我尝试了以下正则表达式:

select * from table
where name ~* '\splacebo\w+' or name ~* '\w+placebo\s'
zbwhf8kr

zbwhf8kr1#

你可以用

select * from table
    where name ~* '^(?:placebo\s+\S+|\S+\s+placebo)$'

查看regex演示
细节 ^ -字符串开头 (?:placebo\s+\S+|\S+\s+placebo) -一个非捕获组匹配 placebo\s+\S+ - placebo ,然后是1+空白,然后是1+非空白 | -或者 \S+\s+placebo -1+非空格,然后1+空格,然后
placebo $ -字符串结尾。

pieyvz9o

pieyvz9o2#

我想你想要:

where col3 ~* '(^\S+\s+placebo)|(placebo\s+\S+$)'

分解:

(
    ^              beginning of the string
    \S+            1 to N characters other than a space
    \s+            1 to N spaces
    placebo        literal string "placebo"
)
|              OR
(
    placebo         literal string "placebo"
    \s+             1 to N spaces
    \S+             1 to N characters other than a space
    $               end of the string
)

我曾经 \S 而不是 \w 因为你想匹配破折号 \w 不会的)。

lstz6jyr

lstz6jyr3#

请注意,您可以使用 like :

where (name like '% Placebo%' and name not like '% % Placebo%') or
      (name like '%Placebo %' and name not like '%Placebo % %')

相关问题