簡體   English   中英

正則表達式,如何匹配:字符串+之間的任意數量的字符+字符串

[英]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'

運作方式如下:

  1. 我假設您的shops表中有一列名為hours的列,其類型為文本類型( varcharnvarchar等),因此hours::json會將列值解析為JSON blob並實例化可以查詢的JSON對象。
  2. 首先,我們需要進行安全檢查,以確保存在一個名為"3"的條目,並且該條目具有其中恰好包含2個元素的數組值(因此以后可以安全地取消引用索引01 )。 我們使用json_array_length( hours::json->'3' ) == 2做到這一點。
  3. 然后我們查找實際的內在值:
    1. ->'3'將訪問名為"3"的對象屬性(因為hours是對象{} ,而不是數組[] )。
    2. ->0假定前一個->'3'返回一個數組,然后獲取索引為[0]的元素(在這種情況下, {"opening":"22:00","closing":"00:00"} )。
    3. ->'closing'然后獲取命名屬性“關閉”。
    4. 然后,將其與期望值“ 00:00”進行比較。
  4. 然后對索引1和屬性“ opening”的元素重復最后3個步驟。

暫無
暫無

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

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