正規表現で末尾2文字が「01」でないデータを取得する方法

このQ&Aのポイント
  • 正規表現を使用して、特定の条件に一致するデータを抽出する方法について説明します。具体的には、末尾2文字が「01」ではないデータを取得する方法に焦点を当てます。
  • 例えば、与えられたデータから末尾2文字が「01」を除くデータを抽出したい場合、正規表現を使って次のように書くことができます:A[0-9][0-9]([^0][0-9])([^1][0-9])'。
  • この正規表現は、1桁目がA、2桁目が0-9の数字で、3桁目が01以外(0を除く数字)であるデータにマッチします。これにより、「A0001」は除外され、「A0101」、「A0201」、「A1001」といったデータが抽出されます。
回答を見る
  • ベストアンサー

正規表現について教えてください。

正規表現について教えてください。 以下の様なデータから末尾2文字が「01」を除くものだけを 取り出したいのですが、どのように書けばよいでしょうか。 ----------------------------- xxx01 xxx02 xxx11 xx100 xx101 xx201 ----------------------------- ※xには、0-9A-Zの何れかが設定 上記の例でいうと、 A0001:除外 A0002:出力 A0011:出力 A0100:出力 A0101:出力 A0201:出力 となります。 要は、 「A0001」は出したくないが、「A0101」、「A0201」、「A1001」などは出したいです。 末尾から3桁目が問題になるのではないかと思っています。 A[0-9][0-9]*[^1]') A[0-9][0-9]+[^1]') A[0-9][0-9][0-9][^1]') A[0-9][0-9][0-9]([^1]+)') A[0-9][0-9]([0-9]+|[0-9][^1])') A[0-9][0-9]([^0][0-9])([^1][0-9])') としてみたのですが、表示されません。 よろしくお願いします。

  • Oracle
  • 回答数5
  • ありがとう数3

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6637/9404)
回答No.5

>(?!0001)$ >A\d\d(?!01)$ >試してみましたが、何も出力されません。 了解しました、「(?!」「文字列」「)」が、「文字列、ではない」を表すはずなのですが、新しめの表現なので実装されていなさそうですね。 >AA001 >AA002 >AA011 >AA100 >AA101 >AA201 >の様なデータがあった場合、AA001以外を取り出したいです。 それならば、「下3桁が、001、では無い」を実現できれば良いでしょうか。 下3桁を数字だと見たとき、「1では無い」って事は、「0 または 2~999 である場合」と言い換えられます。 しかし正規表現はあくまでも文字列でマッチしなければいけませんので、上記をカバーするいくつかのパターンを考えます。 ・000 ※0そのもの ・00[2-9] ※2~9までのいずれか ・0[1-9]\d ※10~99までの任意の数 ・[1-9]\d\d ※100~999までの任意の数 これで全てカバーできますかね。 「000」または「00[2-9]」または「0[1-9]\d」または「[1-9]\d\d」 というのは、カッコと縦棒を使って (000|00[2-9]|0[1-9]\d|[1-9]\d\d) と書けます。 それが末尾にある、と言うことで (000|00[2-9]|0[1-9]\d|[1-9]\d\d)$ で、どうでしょう。

abc999xyz
質問者

お礼

期待した結果が得られました。 ありがとうございます。 また、いろいろとお手数おかけしました。

その他の回答 (4)

  • asciiz
  • ベストアンサー率70% (6637/9404)
回答No.4

>期待した結果になりませんでした。 >いろいろ、 >ご協力いただきありがとうございます。 ちょっと待ってください、私は本当の意味であなたの質問に一度も答えていません。 質問本文の例示は間違っているのですよね? で、回答No.2の補足で訂正されましたが、その例示も、ちょっと理解できないのですが? 間違っていませんか? やりたいことがわからないので、とりあえず「末尾0001以外にマッチ」および「末尾01以外にマッチ」の例を書いたわけですが。 それらがあなたの希望に合っていないなら、ご質問にある >末尾2文字が「01」を除くものだけを >取り出したいのですが、 というそもそもの解決法が求めたいものに合っていないとも考えられます。 それが間違っているならば、それを正規表現化しても、望むものは得られません。 回答No.2補足の訂正例示は、本当に合っているのですか? もっと別の例示はありますか? 私の書いた正規表現は、試されましたか?

abc999xyz
質問者

補足

失礼しました。 あいまいな対応ですみません。 親切に対応して頂いているのに恩を仇で返すような真似で申し訳ありません。 (?!0001)$ A\d\d(?!01)$ 試してみましたが、何も出力されません。 データは、 ----------------------------- xxx01 xxx02 xxx11 xx100 xx101 xx201 ----------------------------- ※xには、0-9A-Zの何れかが設定 のかたちのデータです。 例えば、 AA001 AA002 AA011 AA100 AA101 AA201 の様なデータがあった場合、AA001以外を取り出したいです。 AA[0-9]*[^1] AA[0-9]+[^1] AA[0-9][0-9][^1] AA[0-9][0-9]([^1]+) とすると、末尾が”1”以外が除外となります。 つまり、AA011、AA101、AA201が取り出せません。 AA[0-9]([0-9]+|[0-9][^1]) AA[0-9]([^0][0-9])([^1][0-9]) とすると何も取り出せません。 ^は1文字しか否定できませんので、文字列として否定するにはどうしたら いいですか。 (?!0001)$ A\d\d(?!01)$ 試してみましたが、何も出力されません。

  • asciiz
  • ベストアンサー率70% (6637/9404)
回答No.3

>実際は、 > >A0001:除外したいものなので出力されないようにしたい >A0002:出力 >A0011:出力されない >A0100:出力 >A0101:出力されない >A0201:出力されない すみませんがその例も分かりません。 A0011は出力されるはずでは。 まあ、下01を出力したくなければ、 A\d\d(?!01)$ でどうですか。 ※ \d は [0-9] と同一です。(覚え方: decimalのd)

abc999xyz
質問者

お礼

期待した結果になりませんでした。 いろいろ、 ご協力いただきありがとうございます。

  • asciiz
  • ベストアンサー率70% (6637/9404)
回答No.2

>以下の様なデータから末尾2文字が「01」を除くものだけを >取り出したいのですが、 いえ、そのルール定義では >A0101:出力 >A0201:出力 となる理由がわかりません。 その条件ならば、この2行も除外されなければいけませんが。 むしろ4桁全部含めて、「0001以外」を検索したいんでしょうか? そう考えれば、 (?!0001)$ でどうですか。

abc999xyz
質問者

補足

すみません。 間違っていました。 A0001:除外(出したくない) A0002:出力 A0011:出力 A0100:出力 A0101:出力 A0201:出力 としたいのですが、 実際は、 A0001:除外したいものなので出力されないようにしたい A0002:出力 A0011:出力されない A0100:出力 A0101:出力されない A0201:出力されない 何種類か記載しましたが、中には、すべて出力されたりします。

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.1

A0001 A0002 A0011 A0100 A0101 A0201 に対して「^A0+」を削除すると以下になります。 1 2 11 100 101 201 これで比較するのはどうでしょう。 どういう関数を使ってどう書いているのかわかりませんが、マッチングの関数を1回だけで処理しようとすると困難だし、できたとしてもわかりにくくなってメンテナンス性が下がると思います。 一度不要部分を削除(空文字にreplace)してから、マッチングもしくは数値に変換して比較などすれば比較的シンプルに実装できるのではないかと思います。

abc999xyz
質問者

お礼

ありがとうございます。 参考にさせていただきます。

関連するQ&A

  • 正規表現について

    正規表現で、「空白またはa~zの中の1文字」を表すには[ a-z]でよいのでしょうか?

  • 正規表現について

    正規表現について質問をさせていただきます。 VB6.0にて正規表現を使用し、入力された文字のチェックを行っていますが どうしてもうまくいきません。 チェックしたい文字は A(半角アルファベット大文字1文字)または AAA(半角アルファベット大文字3文字)または (AAA)(半角カッコつき半角アルファベット大文字3文字)で 上記3パターン以外はエラーとしたいと思っています。 パターンは下記のように作成したのですが "(^[\(][A-Z]{3}[\)])|(^[A-Z]{1,3})" A、AAA、(AAA)以外でもA(AA)やAAAA等も正常ケースとして通過してしまいます。 パターンをどのように作成すればよいか教えて下さい。 よろしくお願いします。

  • 正規表現メタ文字「-」のエスケープについて

    いつもお世話になります。 正規表現のメタ文字のエスケープ処理を行いたいのですが、「-」の記号については、「[」「]」の中に出てきたときのみ([a-z]、[0-9]など)、エスケープの対象になります。 この場合、どのような正規表現を指定すれば、エスケープを行うことができるでしょうか。 例)  [a-z|A-z] ⇒ [a\-z|A\-z] 宜しくお願いします。

  • 秀丸の正規表現

    秀丸の正規表現 http://pc.dearie.jp/hidemaru/replace/14.html 上記URLでメールの正規表現について解説があります。 [A-Za-z0-9\-\.\_]+@[A-Za-z0-9\-\_]+\.[A-Za-z0-9\-\.\_]+ この正規表現でメールの検索をおこなっています。この正規表現は理解出来ます。 .*([a-z0-9\-\.\_]+@[a-z0-9\-\_]+\.[a-z0-9\-\.\_]+)([^a-z0-9@\.\-\_]+).* キャプチャを使って正規表現でメールアドレスをマッチしているのは理解できます。 なぜ置換で、「\1,」とやっても、メールアドレスのみを取得できないのでしょうか? 実際に秀丸エディタを使ってやってみましたが、メールアドレスのみ取得することができませんでした。 検索ではメールアドレスにマッチするのに、なんでキャプチャが正しく動かないのかがわかりません・・・

  • Perlで使える正規表現を教えて下さい。

    Perlで使える正規表現を教えて下さい。 半角英語で、小文字が3文字以上続いた後、大文字が来る場合、その大文字の右にスペースを入れる。 これをPerlで使える正規表現を教えて頂けないでしょうか? 例 $str = 'AaaAaaaBbbbbCccccDddBbA'; # Aaa Aaaa Bbbbb Ccccc DddBbA ちなみに、色々ネットで調べて試してみて、 $str =~ s/([a-z])([A-Z])/$1 $2/g; が最も近いコードになったのですが、2文字続いただけでもスペースが入り困っています。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 正規表現

    お世話になります。正規表現の質問です。 \w に当たる文字とハイフンに合致するが、少なくとも一文字はアルファベット(a-z)またはハイフン(-)が含まれていなければならない(つまり、数字だけの文字列は合致しない) という正規表現はどうあらわせばよいでしょうか。 以上、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 正規表現について教えて下さい

    正規表現について教えて下さい $string = "LibrayMyUtil2File AppFile"; $pattern = '/([A-Z][a-z0-9]*)*([A-Z][a-z0-9]*)File/'; $replacement = '$2'; echo preg_replace($pattern, $replacement, $string);//Util2 App と表示される この例のように、「File」の前の単語に置き換えたいのですが、 このやり方だとpatternの「[A-Z][a-z0-9]*」が重複しているのが凡長だと思ってまして もっと短縮された書き方があれば教えてもらいたいです。

    • ベストアンサー
    • PHP
  • 正規表現

    数字と大文字、小文字のアルファベットは入力OK。 記号も入力OK。でも、記号の中でも「”」、「.」は ダメ。しかも、10桁くらい入力できるようにする。 を表す正規表現は [a-zA-Z0-9&&[\"\.]]* と思ったのですが、 正しく表す正規表現はどの様なものになるのでしょうか? お願いします。

    • ベストアンサー
    • Java
  • 正規表現で

    正規表現で、英大文字と記号だけからなる文字列、を表すにはどうすればよいでしょうか。言い方を変えると、とにかく英小文字は含まないという事なんですが… [^a-z]+ かなと思ったのですがダメでした。 123#ABC : OK 123#aBC : NG みたいな感じです。 よろしくお願いします。

  • 正規表現にマッチする文字列の一括出力

    任意の正規表現を与えてやり、そのパターンに合致する文字列を 1行1文字列でテキストファイルに一括出力したいと考えています。 例えば、 [a-z][a-z][a-z] を与えてやると、 aaa aab aac aad ... ... zzx zzy zzz と、26の3乗で17576行の文字列をテキストファイルなどに出力。 LINUXのコマンドラインなら多少分かるのですが、プログラミングは さっぱりで、上記の目的につかえそうなユーティリティも探してみた のですが、見つけることはできませんでした。 よい方法がありましたら、ご教授よろしくお願いいたします。