Postgresql

如何在 Postgres 正則表達式選擇中使用字元類?

  • September 15, 2016

我正在嘗試創建一個查詢,該查詢選擇包含數字 21 的字元串,而不會命中諸如 210 或 121 之類的字元串。我在下面的努力顯示了我的進步,因為我設法對單詞的開頭應用了約束,但我很難在最後提供分隔符。我想匹配21並且21XX 是非數字字元。通常我會[]在有非數字字元或字元串結尾的兩種情況下使用匹配,但我對此感到困惑。

我可以根據單詞和字元類的開頭進行過濾:

# SELECT "buildings"."street_name" FROM "buildings"  WHERE (street_name ~ '\m21[s0]');
street_name
-------------
21st
210th

在這裡,我可以成功使用非數字 ( \D) 約束:

# SELECT "buildings"."street_name" FROM "buildings"  WHERE (street_name ~ '\m21\D');
street_name
-------------
21st

但是當我嘗試使用非數字約束來定義一個類\m21[\D]時(為了匹配字元串'21’)它會失敗。

如何使用非數字後綴或字元串終止符定義與我的目標(在案例 21 中)匹配的正則表達式?

您可以將字元類反轉^為第一個字元:

street_name ~ '\m21[^\d]'

這與以下內容完全相同:

street_name ~ '\m21\D'

或長形式:

street_name ~ '\m21[^[:digit:]]

都不匹配字元串的末尾。我建議兩個分支

street_name ~ '\m21(\D|$)'

…從字面上實現您的要求:

帶有非數字後綴或字元串終止符

合適的測試工具

要檢查您的要求:

SELECT *
    , street_name ~ '\m21(\D|$)' AS erwin
    , street_name ~ '\m21\D*\M'  AS ruy  -- just without parentheses
FROM  (
  VALUES
  (1, '21'    , 'true'::bool)
, (2, '21X'   , 't')
, (3, '21 foo', 't')
, (4, '21X11' , 't') -- !
, (5, '121'   , 'f')
, (6, '210'   , 'f')
, (7, 'X21'   , 'f')
  ) t(id, street_name, should_match);

’ 21X11 : 數字 * 在非數字後綴之後呢?

我的正則表達式接受它,@Ruy 的正則表達式拒絕它。

當我閱讀您的問題時,它應該通過嗎?


\D在另一個字元類中不允許使用(已經反轉的)類速記。手冊:

在括號表達式中,\d, \s, and\w失去了它們的外括號, and \D, \S, and\W是非法的

大膽強調我的。

您沒有明確排除*‘X21’*,但我假設您想從範例中的單詞邊界開始:\m.

引用自:https://dba.stackexchange.com/questions/149598