0

800 万を超えるファイルを含むドライブがあり、CRM システムのファイル ストレージ領域です。ファイルは特定の形式で保存され、それぞれがデータベース内に一致するレコードを持つ必要があります。ただし、セキュリティが非常に低いため、世界と妻も同じドライブにファイルを作成しています。私の仕事は、Powershell と正規表現を使用して実行している無効なファイルを特定することです。一般的な有効なファイル パスは次のようになります。

P:\PERSON\06\19\09\619090.5577930.DOC

すべてのファイルは、EVENT、OPPORTUN、ORGANISA、または PERSON という 4 つのサブディレクトリを含む P: というドライブにあります。これらのそれぞれには、名前の範囲が 00 から 99 までの可変数のサブディレクトリが含まれており、ファイル名はピリオドで区切られた 2 組の数字であり、その後に拡張子が続きます。

このパターンに一致させるために使用している正規表現は次のとおりです。

^P:\\(EVENT|OPPORTUN|ORGANISA|PERSON)\\(\d{2}\\)+\d+\.\d+\.\w{3,4}$

複雑なのは、有効なファイルには、ファイル名の最初の数字セットとサブディレクトリ パスの間に次のような関係があることです。

最後の桁を削除します。

桁の長さが奇数になった場合は、先行ゼロを追加します。

結果の数値をペアに分割すると、それがパスになります。

上記の例を使用すると、次のようになります。

数字の最初のセット: 619090

最後の桁を削除: 61909

長さが奇数なので、先行ゼロを追加: 061909

ペアに分けます: 06\19\09

私の質問は、このロジックを正規表現に組み込むことができるかということです。前方参照または後方参照を使用してそれを行う方法はありますか?

4

2 に答える 2

0

ジェリーの答えは、私を正しい方向に導き、非キャプチャ グループ内にキャプチャ グループを含めることができることを発見しました。以下は、いくつかのテストを含む私の正規表現です。

$samples = @()
$samples += 'P:\PERSON\06\19\09\619090.5577930.DOC' #good
$samples += 'P:\PERSON\19\09\19090.5577930.DOC' #good
$samples += 'P:\PERSON\10\10\10\06\19\09\1010100619090.5577930.DOC' #good
$samples += 'P:\PERSON\06\19\09\619090a.5577930.DOC' #bad
$samples += 'P:\PERSON\06\19\09\61909090.5577930.DOC' #bad
$samples += 'P:\PERSON\06\19\09\6190905577930.DOC' #bad

$regex = '^P:\\(?:EVENT|OPPORTUN|ORGANISA|PERSON)\\'
$regex += '(?:(\d)(\d)\\|0(\d)\\)(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?(?:(\d{2})\\)?'
$regex += '(?:\1\2|\3)\4?\5?\6?\7?\8?\d?\.\d+\.\w{3,4}$'

$samples | % {
    $_ -match $regex

}
于 2013-05-30T09:34:19.500 に答える