Postgresql
如何在 Postgres 正則表達式選擇中使用字元類?
我正在嘗試創建一個查詢,該查詢選擇包含數字 21 的字元串,而不會命中諸如 210 或 121 之類的字元串。我在下面的努力顯示了我的進步,因為我設法對單詞的開頭應用了約束,但我很難在最後提供分隔符。我想匹配
21
並且21X
X 是非數字字元。通常我會[]
在有非數字字元或字元串結尾的兩種情況下使用匹配,但我對此感到困惑。我可以根據單詞和字元類的開頭進行過濾:
# 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
.