簡體   English   中英

Postgresql正則表達式匹配字符串與子字符串

[英]Postgresql regex match string with substring

我有一個字符串foo,bar我想要做的是形成一個匹配它們的查詢(它們之間可以有間隙)

例如,它應該與像這樣的條目匹配

aaa,bbbb,foo,zzz,bar
bar,ccc,ddddd,foo,iiiii

但不是

aaa,eeeee,foo,rrrrrr,hhhhhh
ooooo,ii,sssss,bar,xxxx

我試圖匹配的列是text類型

我試着這樣做

select * from string_entries where str similar to '%(?=.*foo)(?=.*bar)%';

但我收到這個錯誤

ERROR:  invalid regular expression: quantifier operand invalid
SQL state: 2201B

假設這些值必須顯示為完整的逗號分隔條目,您可以使用

where str ~ '^(?=.*(?:,|^)foo(?:,|$))(?=.*(?:,|^)bar(?:,|$))'

在這里,它將使用~ (正則表達式匹配)運算符以任何順序匹配包含foobar字符串。 詳情

  • ^ - 字符串的開始
  • (?=.*(?:,|^)foo(?:,|$)) - 在右邊,應該有零個或多個字符,盡可能多,然后是一個foo字符串(或者在字符串的開頭或逗號后緊跟逗號或字符串結尾位置)
  • (?=.*(?:,|^)bar(?:,|$)) - 緊靠右側,應該有零個或多個字符,盡可能多,然后是bar字符串(或者在字符串的開頭或逗號后緊跟逗號或字符串結尾位置)

假設這些值必須作為整個單詞出現,您可以用\\y單詞邊界替換非捕獲組並使用

where str ~ '^(?=.*\yfoo\y)(?=.*\ybar\y)'

請參閱在線數據庫小提琴

CREATE TABLE string_entries
    (str character varying)
;

INSERT INTO string_entries
    (str)
VALUES
    ('aaa,bbbb,foo,zzz,bar'),
    ('bar,ccc,ddddd,foo,iiiii'),
    ('aaa,eeeee,foo,rrrrrr,hhhhhh'),
    ('ooooo,ii,sssss,bar,xxxx')
;

select str from string_entries where str ~ '^(?=.*(?:,|^)foo(?:,|$))(?=.*(?:,|^)bar(?:,|$))';

在此處輸入圖片說明

我傾向於不使用正則表達式比較來執行此操作,而是將字符串轉換為數組:

select *
from string_entries 
where string_to_array(str, ',') @> array['foo', 'bar']

這僅在您需要相等比較時才有效。 如果您還想使用例如foo%而不是foo進行匹配,那么這將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM