首頁  >  文章  >  後端開發  >  正規表示式到 Glob 以及反之亦然的轉換

正規表示式到 Glob 以及反之亦然的轉換

PHPz
PHPz轉載
2024-02-06 11:03:15823瀏覽

正则表达式到 Glob 以及反之亦然的转换

問題內容

我們有一個要求,希望將正規表示式轉換為雲端前端支援的 Glob,反之亦然。有什麼建議我們如何實現這一點,首先是否可能?特別是從 Regex 到 Glob,據我了解 regex 是一種超集,因此可能無法將所有 Regex 轉換為相應的 Glob?


正確答案


要從 glob 轉換,您需要寫一個解析器,將模式拆分為 抽象語法樹。例如,glob *-{[0-9],draft}.docx 可能會解析為[anything(), "-", oneof([range("0", "9" ), "draft"] ), ".docx"]

然後您將遍歷 ast 並輸出每個節點的等效正規表示式。例如,您可能為此使用的規則可能是:

anything()  -> .*
range(x, y) -> [x-y]
oneof(x, y) -> (x|y)

產生正規表示式 .*-([0-9]|draft).docx

這並不完美,因為您還必須記住轉義任何特殊字符; . 是正則表達式中的特殊字符,因此您應該對其進行轉義,最終生成 .*-([0-9]|draft)\.docx

嚴格來說,正規表示式不能全部轉換為 glob 模式。 globbing 中不存在 kleene star 操作;簡單正規表示式 a* (即任意數量的 a 字元)無法轉換為 glob 模式。

我不確定 cloudfront 支援哪些類型的 glob(文檔未返回術語“glob”的匹配項),但是 這裡是一些有關普遍支援的 shell glob 模式通配符的文檔

以下是一些等效序列的總結:

A character not in the range#One of the given charactersOne of the given optionsOne of the given options, considering nested wildcards
Glob Wildcard Regular Expression Meaning
? . Any single character
* .* Zero or more characters
[a-z] #[a-z] #Any character from the range
[!a-m] [^a-m]
[a,b,c] [abc]
{cat,dog,bat} (cat|dog|bat)
{*.tar,*.gz} #(.*\.tar|.*\.gz)
###

以上是正規表示式到 Glob 以及反之亦然的轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除