- PR -

条件と一致するファイルをヒットさせる正規表現

投稿者投稿内容
koara
ベテラン
会議室デビュー日: 2005/09/16
投稿数: 96
投稿日時: 2007-01-26 11:20
いつもお世話になっております。
koaraと申します。

フォルダ内から下記の条件全てを満たすファイルをヒットさせる
正規表現を考えて行き詰っております。

ファイル名は全て半角英数の大文字という前提で、
正規表現のみを用いて1回で判断させたいです。

正規表現に使っているライブラリは
Microsoft VBScript Regular Expressions 5.5
です。

引用:

【判定条件】

条件1. 拡張子が.TXT である
条件2.拡張子「.TXT」の直前の1文字が"A"ではない

exp.) ********A.TXT

条件3.拡張子「.TXT」の直前の1文字が数字の時は、
数字の直前の1文字が"A"ではない

exp.) ********A[1桁の数字].TXT



いろいろと試してみましたが、
最後に考えたのが下記の正規表現です。
引用:

(.*[^V]¥.TXT) && (.*[^V][^1-9]¥.TXT)


*「¥.TXT」の部分、半角¥が投稿できなかったので
全角になっております。

(.*[^V]¥.TXT) を条件2、
(.*[^V][^1-9]¥.TXT) を条件3
と考えています。

条件2だけだとうまくいくのですが、
条件3を追加するとうまくいきません。

AND(論理積)が使えるのかも定かではありません。

皆様のお知恵を拝借させて下さい、
解決に至るアドバイスをよろしくお願いします。


明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 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 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 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 ]
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2007-01-26 13:33
引用:

angelさんの書き込み (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 ]



これだと
1.TXT
にマッチしないです
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2007-01-26 13:59
ご指摘ありがとうございます。
引用:
明智重蔵さんの書き込み (2007-01-26 13:33) より:
これだと
1.TXT
にマッチしないです


投稿当初、“1.TXT”等にもマッチするように、
 \(^[0-9]\|[^A0-9]\|[^A][0-9]\).TXT$
にしていたのですが、
引用:
条件3.拡張子「.TXT」の直前の1文字が数字の時は、
数字の直前の1文字が"A"ではない


の条件として、
 ・数字の直前に文字がないか、もしくはA以外の文字がある
 ・数字の直前にA以外の文字がある
どちらの解釈が自然かを考え直して、後者の解釈に変えて載せ直したのです。
すぐに直したので特に断りを入れていなかったのですが、補足しておいた方が良かったですね。
koara
ベテラン
会議室デビュー日: 2005/09/16
投稿数: 96
投稿日時: 2007-01-26 14:01
明智重蔵様 レスありがとうございます。

頂いたアドバイスの確認に手間取ってしまい、
話題に追いつかなくてすみません。

引用:

EmEditorバージョン6.00.2で動作確認しました

(?<!A)(?<!A[0-9])\\.TXT$




Microsoft VBScript Regular Expressions 5.5では
(?<!pattern)という構文は使えないようでした。

Linux環境のgrep-2.5.1-16では
$ ls | grep (?<!A)(?<!A[0-9])\\.TXT$
とすると !Aをヒストリとして認識してしまいました。

明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2007-01-26 14:28
引用:

koaraさんの書き込み (2007-01-26 14:01) より:
明智重蔵様 レスありがとうございます。

頂いたアドバイスの確認に手間取ってしまい、
話題に追いつかなくてすみません。

引用:

EmEditorバージョン6.00.2で動作確認しました

(?<!A)(?<!A[0-9])\.TXT$




Microsoft VBScript Regular Expressions 5.5では
(?<!pattern)という構文は使えないようでした。

Linux環境のgrep-2.5.1-16では
$ ls | grep (?<!A)(?<!A[0-9])\.TXT$
とすると !Aをヒストリとして認識してしまいました。





ならば、angelさんの二つの案を
仕様に応じて使えばいいですね
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)