なぜ期待した結果が得られないのか...
ファイル名全体で 1 項目の配列を取得する理由は、パターンがファイル名全体に一致し、1 回一致するためです。
2 つのグループをキャプチャしていますが、 rematchはキャプチャされたグループの配列ではなく、一致の配列を返すため、それらのグループは表示されません。
問題を解決する方法...
.htaccess
単純なファイル (つまり、noまたは類似)を扱っている場合、最も簡単な解決策は、単に使用することです...
ListLast( filename , '.' )
....ファイル拡張子のみを取得し、拡張子なしで名前を取得するには...
rematch( '.+(?=\.[^.]+$)' , filename )
これは、先読みを使用して、文字列の最後に.
少なくとも 1 つの非 - が続くことを確認.
しますが、(これは先読みであるため) 一致から除外されます (したがって、一致では拡張前の部分のみが取得されます)。 .
拡張子のないファイル (.htaccess
や などREADME
) を処理するには、上記の正規表現を変更し.+(?=(?:\.[^.]+)?$)
て、拡張子をオプションにする以外は基本的に同じことを行います。ただし、これらの ListLast メソッドを更新する簡単な方法はありません (確認する必要があると思いますlen(extension) LT len(filename)-1
)。
(オプション)キャプチャされたグループにアクセスしています...
実際にキャプチャされたグループを取得したい場合、CF でこれを行うための最も近いネイティブな方法は、4 番目の引数を true に設定してrefind関数を使用することですが、これは位置と長さのみを提供します。それらを自分で抽出します。
この理由から (他の多くの理由の中でも)、CF 用の改良された正規表現実装を作成しました。これは cfRegex と呼ばれ、グループ テキストを直接返すことができます (つまり、mid をいじることはありません)。
cfRegex を使用したい場合は、次のように元のパターンで行うことができます。
RegexMatch( '(.+?)(\.[^.]*$|$)' , filename , 1 , 0 , 'groups' )
または名前付き引数を使用:
RegexMatch( pattern='(.+?)(\.[^.]*$|$)' , text=filename , returntype='groups' )
そして、一致の配列が返されます。各要素は、その一致のキャプチャされたグループの配列です。
キャプチャされたグループを扱う多くの正規表現作業を行っている場合、CF の re メソッドで行うよりもcfRegexの方が確実に優れています。
拡張子および/または拡張子を除外したファイル名を取得することだけが重要な場合は、上記の前の例で十分です。