正規表現をクラウド フロントエンドでサポートされている Glob に変換する、またはその逆に変換するという要件があります。これを達成する方法と、そもそもそれは可能ですか?特に正規表現からグロブへ、私が理解しているように、正規表現はスーパーセットであるため、すべての正規表現を対応するグロブに変換することはできない可能性がありますか?
グロブから変換するには、パターンを 抽象構文ツリーに分割するパーサーを作成する必要があります。たとえば、glob *-{[0-9],draft}.docx
は [anything(), "-", oneof([range("0", "9") に解決される可能性があります。 )、"ドラフト"] )、".docx"]
。
その後、ast を反復処理して、各ノードの同等の正規表現を出力します。たとえば、これに使用できるルールは次のとおりです:
リーリー正規表現 .*-([0-9]|draft).docx
を生成します。
これは完璧ではありません。特殊文字をエスケープすることも忘れずに行う必要があります。.
は正規表現内の特殊文字であるため、エスケープする必要があり、結果は .*- ([0-9]|ドラフト)\.docx
。
厳密に言えば、正規表現をすべて glob パターンに変換できるわけではありません。 kleene star 操作はグロビングには存在しません。単純な正規表現 a*
(つまり、任意の数の a
文字) をグロブ パターンに変換することはできません。 。
Cloudfront がサポートするグロブのタイプがわかりません (ドキュメントでは「グロブ」という用語に一致するものが返されません) が、 一般的にサポートされるシェル グロブ パターン ワイルドカードに関するドキュメントは次のとおりです 。
以下は、いくつかの同等のシーケンスの概要です:
グロブワイルドカード | ###正規表現### ###意味###||
---|---|---|
. |
任意の 1 文字
|
|
##.*
| ゼロ個以上の文字
|
[a-z] |
[a-z]
| 範囲内の任意の文字
######[!午前]######
|
[^a-m] |
|
[a、b、c]
|
[abc] |
|
{猫、犬、コウモリ}
|
(猫|犬|コウモリ) |
|
{*.tar,*.gz}
|
(.*\.tar|.*\.gz) |
|
以上が正規表現から Glob への変換、およびその逆の変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。