我們有一個要求,希望將正規表示式轉換為雲端前端支援的 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 模式通配符的文檔。
以下是一些等效序列的總結:
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 character not in the range |
[a,b,c] |
[abc] |
#One of the given characters |
{cat,dog,bat} |
(cat|dog|bat) |
One of the given options |
{*.tar,*.gz} |
#(.*\.tar|.*\.gz) |
One of the given options, considering nested wildcards |
以上是正規表示式到 Glob 以及反之亦然的轉換的詳細內容。更多資訊請關注PHP中文網其他相關文章!