• ベストアンサー

「指定文字列を含まない行」を指定する正規表現

正規表現で指定した文字列を"含まない"行を指定する方法はありますでしょうか。 例えば、 ABDDDDG ABEEEEG ABFFFFG ABXXXXG ABHHHHG とある場合、「XXXX」を含まない行、という指定をして他の4行を指定したいのです。

質問者が選んだベストアンサー

  • ベストアンサー
  • sholmes
  • ベストアンサー率81% (89/109)
回答No.3

ANo1さんも仰られているとおり、御自身で開発されるのであればプログラム言語側の判別で振り分けたほうが良いと思います。 ただ其れとは別に特定ツールの機能内で何とかしたい等、「どうしても正規表現で」ということであればで一例を記載しますが・・・おすすめはしません。 # 基本形 # 空行(というか、改行のみ)だろうとマッチ # 否定先読みによって、「弾きたい文字列の表われない行の行頭」にマッチさせています。 /^(?!.*XXXX)/ http://ideone.com/TFsXh # 応用例 # 空行(というか、改行のみ)はマッチ除外 /^.(?!.*XXXX)/ http://ideone.com/XvywR <おまけ> 否定戻り読みはPCRE系でも利用できない物が多く感じる為省きました。 最後に再掲しますが、この手法をお勧めはしません。

himura99
質問者

お礼

頂いた正規表現を秀丸で試したところ、 ^.(?!.*XXXX).*$ という形で行指定が出来ました! 正直頂いた形を完全に理解出来ていないのですが、一つずつ確認したいと思います。 ご回答ありがとうございました。

その他の回答 (3)

回答No.4

他の方の回答を見ていると、 プログラムとしてつくるのが案外大変なのがわかります。 参考までに、awkですと、こんな感じでしょうか。 データが test.txt に入っているとして、 gawk "!/XXXX/" test.txt

himura99
質問者

お礼

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

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.2

直接「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') );

himura99
質問者

お礼

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

プログラムとかでやるなら「XXXXを含む行 ではない」というやりかたが簡単なのですが。 grepコマンドの例: grep -v XXXX # -v は「マッチしない行を出力する」オプション sedコマンドの例: sed '/XXXX/d' # XXXXにマッチした行を削除する Perlでの例: if ( !/XXXX/ ) { # XXXX を含まない行の処理 }

himura99
質問者

お礼

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

関連するQ&A

  • 正規表現でマッチさせたい文字列の指定方法

    正規表現でマッチさせたい文字列の指定方法について こんにちは。正規表現について教えてください。 秀丸エディタでgrepする時に先頭行に 『ファイル名(行数): 』という文字列が 先頭行に入りますが、これを正規表現を使用して消したいと思っています。 具体的には以下のような表現ですが、どのように指定するのが正しいでしょうか。 いくらかテストしているのですが、なかなかうまくできず困っています。 消したい文字列 test.log-110411-01.bak.text(38): よろしくお願いします

  • 正規表現で特定の文字列に一致しない条件の指定

    正規表現で特定の文字列(2文字以上)に一致しない場合の条件指定は可能でしょうか? 例えば、[^CEG] と指定すると文字の「C」、「E」、「G」以外の文字にマッチするということになりますが、 複数の文字で構成された文字列で同じようなことをする方法はないのでしょうか? 例えば、「Japan」を含まないなどの指定方法を知りたいです。 以下の場合、文字列の途中に含まれている「Japan」を上手く見つけることができ、 1を除外し2と3だけがマッチする正規表現の指定方法が知りたいです。 1. 「この国はJapanです。」 2. 「この国はChinaです。」 3. 「この国はUSAです。」

  • 正規表現で特定文字列を含まない行を削除したいのですが

    テキストエディタ mi で正規表現のより「※補足」という文字列を含む行だけ残して他の行を削除しようとしています。 具体的には、 検索文字列 ^(?!.*\※補足).*$ 置換文字列            ← 空白 としてやっているんですが、例えば   なんとかかんとかで何やらが何として…   ※補足:よくわかりません   ※補足:質問します というテキストを上の方法で全置換すると何も起きません。 そこで試しに 検索文字列 ^(?!.*\※補足).*$ 置換文字列 ----- としてみました。 この場合、本当なら   -----   ※補足:よくわかりません   -----   ※補足:質問します となることを期待していたのですが、実際は   -----なんとかかんとかで何やらが何として…   ※補足:よくわかりません   -----   ※補足:質問します となってしまい、要するに「※補足」という文字列が含まれない行は正しく見つけてくれるものの、含まれていない行については、その行丸ごとを置き換えるのではなく行頭に置換文字列を付加するだけになってしまいます。 これは、何がどう悪いのでしょうか? ちなみに、こちらのサイトで「テキストで特定の文字列を含む行を削除」とQ&Aを検索すると、私の場合で言えば「^.*※補足.*\n」→「」(空白)という置換えで可能というご回答が見つかるのですが、miの場合、これでは「※補足」という文字列が含まている行も含まれていない行も見つけてくれませんでした。 どう直せば目的が達成されるか教えて頂けないでしょうか? どうかよろしくお願い致します。

    • ベストアンサー
    • Mac
  • 正規表現について教えてください。

    正規表現について教えてください。 Oracleで開発を行っている者ですが、ネットや本で調べても わからない箇所がありましたので、ここに質問として挙げさせていただきます。 ご教示いただけると幸いです。 現在、下記のようなデータが入ったテーブルがあります。 ---------------------------------------------------------------------------------- ID | SENTENCE          | REG_EXP ---------------------------------------------------------------------------------- 1 | <○○○:XXXX>      | [^<][^:]+ ---------------------------------------------------------------------------------- 2 | <○○○:XXXX>→<△△△:XXXX> | ---------------------------------------------------------------------------------- 3 | ■■■■■<○○○:XXXX> | ---------------------------------------------------------------------------------- このテーブルを使って、アプリを作っているのですが、 期待動作としては、SENTENCEの列に入っている文字列を REG_EXPの列に入っているデータ(正規表現のパターン)で マッチした文字列を切り取るようにしたいのです。 例えば、IDが1の場合は○○○が切り取られるのが期待動作です。 (注.この動作は、REGEXP_SUBSTR関数を用いてSQLで実行します。) お聞きしたいのは、IDが2の場合は△△△を、IDが3の場合は○○○を、 配列の最初の要素に入れるには、正規表現をどのように記載すればよいのか、ということです。 ○、△、■、Xの部分は英数字、日本語のどれが入るのかはわかりませんが、 <や→、:などの全角記号のフォーマットはこのままになります。。 IDが2の正規表現は[^<:→]+[^<:→]+[^<:→]+ で試してみたのですが、 うまく出来ませんでした・・・。 テーブルの線の調整がうまくできず、 表が見づらくて申し訳ありませんが、 正規表現に詳しい方、ご教示をよろしくお願いいたします。

  • テキストエディッタによる正規表現

    EmEditorで正規表現を行っております。 検索してもサンプルが見当たらなかったので、 どなたかご教授いただけるとたすかります。 ・1行目~13行目まで文字列関係なく正規表現 ※1行目から指定行までの ・1行目の空白を削除(先頭文字ではなく何も書かれてない1行目の行を削除したいです) よろしくお願いいたします。

  • 正規表現 許可文字列 かつ 指定連続文字列の排除

    わかりにくいタイトルで恐縮です。 初歩的な問題かもしれませんが、もう何日も悩み続けており、ヒントでもいただけると助かります。 たとえば、 正規表現にて 英字のみ(1文字以上) という場合は preg_match("/[a-z]+/i",$string) という風にすればいいと思います。 ここで、英字のみ(1文字以上) しかし、abc という連続文字列があれば該当させない、という場合どういう正規表現を作ればいいのでしょうか? preg_match("/[a-z^(abc)]+/i",$string) みたいなヘンテコなものを作ってみたりしてみたのですが、文法違いなのか、やはり正常には動いてくれません。 ([^a][^b][^c]) なんていうのも違いますし。 狙いは、文字列の最初でも最後でも途中でも、指定文字以外や指定連続文字列がある場合は、エラーを出す、というようなものにしたいのです。 なにかヒントいただければと思います。

    • ベストアンサー
    • PHP
  • ''で囲まれていない文字列にマッチする正規表現

    下記のような文字列($str)に対して置換を行い、 my $str = qq{ AAA = BBB - 'CCC' }; $str =~ s/★正規表現★/sprintf("DDD(%s)",$1)/xmsge ; 変換後 $str = DDD(AAA) = DDD(BBB) - 'CCC' ; を実現する★正規表現★を書きたいと思っています。  ・AAA,BBB,CCCは[\w]で構成される文字列です。 ですが、シングルクォーテーション('')で囲まれていない文字列にマッチする正規表現が書けなく困っています。 一度、シングルクォーテーションで囲まれているものも含めて全てDDD()をつけて、そのあとで、シングルクォーテーションを含むものは元に戻すことでやりたいことは実現できているのですが、1行で実現できる方法を探しています。 アドバイスよろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現を使った文字列の抽出方法について

    正規表現を使った文字列の抽出方法について RHELを使っています。 テキストデータの中に、以下のようなデータが 百万行単位で並んでいます。(カンマ区切り、2列構成) 1, 1.24425 2, 3.25252 (中略) 13, 6.25365 14, 8,36222 (中略) 103633, 252525.0 最終的にやりたいことは2列目のデータのみの抽出です。 考え方として、正規表現で 「<任意の文字列の連続><カンマ>」という文字列を認識させ、 それを「空欄」で置換したいと考えています。 文字列の最後の文字をマッチさせる指定子が「$」という情報をWebで見つけたので まず、grepで見つけられるか以下のようにやってみたのですが、 grep -i ",$" test.txt $が環境変数と取られ、構文エラーとなってしまいます。 使い方がおかしいのでしょうか? ちなみに、うすうす感じている疑問として、「$」は文末にくるものしかマッチしなかったり しますでしょうか? カンマ区切りなので、表計算ソフトを使えなくもないですが、 行数がExcel2007の限界をよく超えるので、それ以外の方法で考えています。 アドバイスよろしくお願いいたします。

  • 特定文字列を含まない行を削除

    以前特定文字列を含む行を削除する方法の質問をし、正規表現を置換することでできることを知りました。^.*特定の文字列.*\n 今度は特定文字列を含まない行を削除を削除したいです。 この場合どう記述すればいいでしょうか? また、特定文字列1と特定文字列2のどちらかを含まない行を削除する方法もあわせて知りたいです。

  • 正規表現で文字列を区切りたい

    PHPで、正規表現で文字列を分割する方法がわかりません。 やりたいことは、 1|ねこ|2|こあら|3|りす という文字列を、 1|ねこ 2|こあら 3|りす というように、直前の文字が数字でない|で区切りたいです。 区切るための関数は、mb_splitを考えています。 http://php.benscom.com/manual/ja/function.mb-split.php 調べていて、以下のページに書かれている話が近いのかなと思うのですが、 そこで述べられている正規表現の仕組みがよく分からないでいます。 http://okwave.jp/qa1849763.html ご教示よろしくお願いします。

    • ベストアンサー
    • PHP