- - PR -
条件と一致するファイルをヒットさせる正規表現
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-01-26 11:20
いつもお世話になっております。
koaraと申します。 フォルダ内から下記の条件全てを満たすファイルをヒットさせる 正規表現を考えて行き詰っております。 ファイル名は全て半角英数の大文字という前提で、 正規表現のみを用いて1回で判断させたいです。 正規表現に使っているライブラリは Microsoft VBScript Regular Expressions 5.5 です。
いろいろと試してみましたが、 最後に考えたのが下記の正規表現です。
*「¥.TXT」の部分、半角¥が投稿できなかったので 全角になっております。 (.*[^V]¥.TXT) を条件2、 (.*[^V][^1-9]¥.TXT) を条件3 と考えています。 条件2だけだとうまくいくのですが、 条件3を追加するとうまくいきません。 AND(論理積)が使えるのかも定かではありません。 皆様のお知恵を拝借させて下さい、 解決に至るアドバイスをよろしくお願いします。 | ||||||||
|
投稿日時: 2007-01-26 12:12
EmEditorバージョン6.00.2で動作確認しました
(?<!A)(?<!A[0-9])\.TXT$ 01234.TXT A12.TXT A1.TXT XXXXA.TXT BBBBB.TXT 1番目と2番目と5番目 が部分マッチします 部分マッチで不十分なら先読みを使えばいいでしょう [ メッセージ編集済み 編集者: 明智重蔵 編集日時 2007-01-26 13:15 ] | ||||||||
|
投稿日時: 2007-01-26 13:16
こんにちは。
何故に Linux Square会議室かは分かりませんが、折角なのでregex(7)に沿って。 否定形ではない形で条件を書いてみると、 ・(A,数字以外の文字).TXT で終わる場合、条件に当てはまる ・(A以外の文字)数字.TXT で終わる場合、条件に当てはまる 正規表現としては、これらを | で連結します。 \([^A0-9]\|[^A][0-9]\).TXT$ ※VBの正規表現エンジンの場合に、\ が必要かどうかは分かりません。 [ メッセージ編集済み 編集者: angel 編集日時 2007-01-26 13:17 ] | ||||||||
|
投稿日時: 2007-01-26 13:33
これだと 1.TXT にマッチしないです | ||||||||
|
投稿日時: 2007-01-26 13:59
ご指摘ありがとうございます。
投稿当初、“1.TXT”等にもマッチするように、 \(^[0-9]\|[^A0-9]\|[^A][0-9]\).TXT$ にしていたのですが、
の条件として、 ・数字の直前に文字がないか、もしくはA以外の文字がある ・数字の直前にA以外の文字がある どちらの解釈が自然かを考え直して、後者の解釈に変えて載せ直したのです。 すぐに直したので特に断りを入れていなかったのですが、補足しておいた方が良かったですね。 | ||||||||
|
投稿日時: 2007-01-26 14:01
明智重蔵様 レスありがとうございます。
頂いたアドバイスの確認に手間取ってしまい、 話題に追いつかなくてすみません。
Microsoft VBScript Regular Expressions 5.5では (?<!pattern)という構文は使えないようでした。 Linux環境のgrep-2.5.1-16では $ ls | grep (?<!A)(?<!A[0-9])\\.TXT$ とすると !Aをヒストリとして認識してしまいました。 | ||||||||
|
投稿日時: 2007-01-26 14:28
ならば、angelさんの二つの案を 仕様に応じて使えばいいですね | ||||||||
|
投稿日時: 2007-01-26 14:43
WSH5.6で確認してみました。
こなれた書き方じゃないと思いますが、 使っているテクニックが少ないのでわかりやすいかと思います。 1.TXTも引っかかる方にしてあります。 Set re = new RegExp re.Pattern = "^([\dA-Z]*([B-Z]|[\dB-Z]\d)|\d)\.TXT$" ' わかり易い書き方版(冗長です) 're.Pattern = "^([0-9A-Z]*([B-Z]|[0-9B-Z][0-9])|[0-9])\.TXT$" ' テスト inputarr = Array("01234.TXT", "A12.TXT", "A1.TXT","XXXXA.TXT", "BBBBB.TXT", "1.TXT") ans = "" For Each x in inputarr If re.Test(x) Then ans = ans & x & vbTab & "○" & vbCrLf Else ans = ans & x & vbTab & "×" & vbCrLf End If Next MsgBox ans |