プロが教えるわが家の防犯対策術!

正規表現で指定した文字列を"含まない"行を指定する方法はありますでしょうか。
例えば、

ABDDDDG
ABEEEEG
ABFFFFG
ABXXXXG
ABHHHHG

とある場合、「XXXX」を含まない行、という指定をして他の4行を指定したいのです。

A 回答 (4件)

ANo1さんも仰られているとおり、御自身で開発されるのであればプログラム言語側の判別で振り分けたほうが良いと思います。


ただ其れとは別に特定ツールの機能内で何とかしたい等、「どうしても正規表現で」ということであればで一例を記載しますが・・・おすすめはしません。

# 基本形
# 空行(というか、改行のみ)だろうとマッチ
# 否定先読みによって、「弾きたい文字列の表われない行の行頭」にマッチさせています。
/^(?!.*XXXX)/
http://ideone.com/TFsXh

# 応用例
# 空行(というか、改行のみ)はマッチ除外
/^.(?!.*XXXX)/
http://ideone.com/XvywR

<おまけ>
否定戻り読みはPCRE系でも利用できない物が多く感じる為省きました。
最後に再掲しますが、この手法をお勧めはしません。
    • good
    • 0
この回答へのお礼

頂いた正規表現を秀丸で試したところ、
^.(?!.*XXXX).*$
という形で行指定が出来ました!

正直頂いた形を完全に理解出来ていないのですが、一つずつ確認したいと思います。
ご回答ありがとうございました。

お礼日時:2011/06/09 21:32

他の方の回答を見ていると、


プログラムとしてつくるのが案外大変なのがわかります。

参考までに、awkですと、こんな感じでしょうか。

データが test.txt に入っているとして、
gawk "!/XXXX/" test.txt
    • good
    • 0
この回答へのお礼

awkというのは知らなかったのですがかなりシンプルに出来そうですね。ちょっと調べてみたいと
思います。
ご回答ありがとうございました。

お礼日時:2011/06/09 21:25

直接「XXXXを含まない」を表現してみたけど、


これが実用的につかえることってほぼないよね。
https://ideone.com/OYh6a

var arr = [
  "ABDDDDG"
 ,"ABEEEEG"
 ,"ABFFFFG"
 ,"ABXXXXG"
 ,"ABHHHHG"
];
var reg = /^(?:[^X]|X[^X]|XX[^X]|XXX[^X])*$/
print(
  arr.filter(function (s) {
    return reg.test(s);
  }).join('\n')
);
    • good
    • 0
この回答へのお礼

やはりプログラム込みでないと厳しいのですね。
ご回答ありがとうございました。

お礼日時:2011/06/09 21:23

プログラムとかでやるなら「XXXXを含む行 ではない」というやりかたが簡単なのですが。



grepコマンドの例:
grep -v XXXX
# -v は「マッチしない行を出力する」オプション

sedコマンドの例:
sed '/XXXX/d'
# XXXXにマッチした行を削除する

Perlでの例:
if ( !/XXXX/ ) {
# XXXX を含まない行の処理
}
    • good
    • 0
この回答へのお礼

秀丸でサッとやりたい、という想定でしたので正規表現のみでやれるのがベストなのですが
それはムリなのですね。
教えていただいた方法を使いたいと思います。
ありがとうございました!

お礼日時:2011/06/09 21:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!