正規表現から Glob への変換、およびその逆の変換

PHPz
リリース: 2024-02-06 11:03:15
転載
791 人が閲覧しました

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

質問の内容

正規表現をクラウド フロントエンドでサポートされている 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 つネストされたワイルドカードを考慮した、指定されたオプションの 1 つ
グロブワイルドカード
. 任意の 1 文字
##.* [a-z]
[a-z] ######[!午前]###### [^a-m]
[a、b、c] [abc]
{猫、犬、コウモリ} (猫|犬|コウモリ)
{*.tar,*.gz} (.*\.tar|.*\.gz)

以上が正規表現から Glob への変換、およびその逆の変換の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:stackoverflow.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!