[英]Regex match float number inside of a string with any char or space in between
[英]Regex, how to match: string + any number of characters in between + string
這似乎是一個非常基本的問題,但我只是找不到解決方法。
這是我的測試字符串:例如
{
"timezone": "CET",
"7": [
{"opening":"13:00","closing":"00:00"},
{"opening":"00:00","closing":"02:15"}
],
"1":[
{"opening":"13:00","closing":"16:00"},
{"opening":"20:00","closing":"00:00"},
{"opening":"00:00","closing":"03:00"}
],
"2": [
{"opening":"13:00","closing":"16:00"},
{"opening":"20:00","closing":"00:00"}
],
"3": [
{"opening":"22:00","closing":"00:00"},
{"opening":"00:00","closing":"02:15"}
],
"4": [
{"opening":"13:00","closing":"16:00"},
{"opening":"20:00","closing":"23:15"}
],
"5": [
{"opening":"13:00","closing":"16:00"},
{"opening":"20:00","closing":"23:15"}
],
"6": [
{"opening":"13:00","closing":"16:00"},
{"opening":"20:00","closing":"00:00"}
]
}
我這里的內容是商店關門/開門時間的JSON。
我只需要檢查一周中的第三天是否具有此確切的字符串即可: closing":"00:00"},{"opening":"00:00"
這里要注意兩件事。
在"3":
和closing":"00:00"},{"opening":"00:00"
字符串之間,可以存在任意數量的字符,但不固定,因為商店可以有1,2或3個關閉如果固定的話,我將在正則表達式中使用X數量的通配符,而我不會問這個問題。
另請注意,不應在一周的第3天的界限之外搜索closing":"00:00"},{"opening":"00:00"
字符串。因此,第3天的右括號[ ]
星期幾應該是匹配停止的地方,因為我不希望在剩余的幾天中匹配字符串。
您需要將其解析為JSON而不使用正則表達式, 因為JSON不是 常規語言,並且僅當您的JSON字符串始終具有完全相同的句法和語義結構時,才可以使用正則表達式,這可能會或可能不會得到保證。應用。
幸運的是,PostgreSQL有一個全面的JSON運算符和JSON函數庫 ,即使您將JSON作為文本存儲在列中(而不是使用JSON列數據類型),您也可以使用。
我想您會想要這樣的東西(請注意,我不是PostgreSQL專家,並且此查詢子句可能不起作用):
SELECT
*
FROM
shops
WHERE
json_array_length( hours::json->'3' ) == 2
AND
hours::json->'3'->0->'closing' = '00:00'
AND
hours::json->'3'->1->'opening' = '00:00'
運作方式如下:
shops
表中有一列名為hours
的列,其類型為文本類型( varchar
, nvarchar
等),因此hours::json
會將列值解析為JSON blob並實例化可以查詢的JSON對象。 "3"
的條目,並且該條目具有其中恰好包含2個元素的數組值(因此以后可以安全地取消引用索引0
和1
)。 我們使用json_array_length( hours::json->'3' ) == 2
做到這一點。 ->'3'
將訪問名為"3"
的對象屬性(因為hours
是對象{}
,而不是數組[]
)。 ->0
假定前一個->'3'
返回一個數組,然后獲取索引為[0]
的元素(在這種情況下, {"opening":"22:00","closing":"00:00"}
)。 ->'closing'
然后獲取命名屬性“關閉”。 1
和屬性“ opening”的元素重復最后3個步驟。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.