首页  >  文章  >  后端开发  >  正则表达式到 Glob 以及反之亦然的转换

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

PHPz
PHPz转载
2024-02-06 11:03:15772浏览

正则表达式到 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 stara* (即任意数量的 a 操作;简单正则表达式

字符)无法转换为 glob 模式。

我不确定 cloudfront 支持哪些类型的 glob(文档未返回术语“glob”的匹配项),但是 这里是一些有关普遍支持的 shell glob 模式通配符的文档

以下是一些等效序列的总结:
Glob WildcardRegular ExpressionMeaningAny single characterZero or more charactersAny character from the rangeA character not in the rangeOne of the given charactersOne of the given optionsOne of the given options, considering nested wildcards
? .
* .*
[a-z] [a-z]
[!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删除