正規表現で末尾2文字が「01」でないデータを取得する方法
- 正規表現を使用して、特定の条件に一致するデータを抽出する方法について説明します。具体的には、末尾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])') としてみたのですが、表示されません。 よろしくお願いします。
- abc999xyz
- お礼率81% (170/208)
- Oracle
- 回答数5
- ありがとう数3
- みんなの回答 (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)$ で、どうでしょう。
その他の回答 (4)
- asciiz
- ベストアンサー率70% (6637/9404)
>期待した結果になりませんでした。 >いろいろ、 >ご協力いただきありがとうございます。 ちょっと待ってください、私は本当の意味であなたの質問に一度も答えていません。 質問本文の例示は間違っているのですよね? で、回答No.2の補足で訂正されましたが、その例示も、ちょっと理解できないのですが? 間違っていませんか? やりたいことがわからないので、とりあえず「末尾0001以外にマッチ」および「末尾01以外にマッチ」の例を書いたわけですが。 それらがあなたの希望に合っていないなら、ご質問にある >末尾2文字が「01」を除くものだけを >取り出したいのですが、 というそもそもの解決法が求めたいものに合っていないとも考えられます。 それが間違っているならば、それを正規表現化しても、望むものは得られません。 回答No.2補足の訂正例示は、本当に合っているのですか? もっと別の例示はありますか? 私の書いた正規表現は、試されましたか?
補足
失礼しました。 あいまいな対応ですみません。 親切に対応して頂いているのに恩を仇で返すような真似で申し訳ありません。 (?!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)
>実際は、 > >A0001:除外したいものなので出力されないようにしたい >A0002:出力 >A0011:出力されない >A0100:出力 >A0101:出力されない >A0201:出力されない すみませんがその例も分かりません。 A0011は出力されるはずでは。 まあ、下01を出力したくなければ、 A\d\d(?!01)$ でどうですか。 ※ \d は [0-9] と同一です。(覚え方: decimalのd)
お礼
期待した結果になりませんでした。 いろいろ、 ご協力いただきありがとうございます。
- asciiz
- ベストアンサー率70% (6637/9404)
>以下の様なデータから末尾2文字が「01」を除くものだけを >取り出したいのですが、 いえ、そのルール定義では >A0101:出力 >A0201:出力 となる理由がわかりません。 その条件ならば、この2行も除外されなければいけませんが。 むしろ4桁全部含めて、「0001以外」を検索したいんでしょうか? そう考えれば、 (?!0001)$ でどうですか。
補足
すみません。 間違っていました。 A0001:除外(出したくない) A0002:出力 A0011:出力 A0100:出力 A0101:出力 A0201:出力 としたいのですが、 実際は、 A0001:除外したいものなので出力されないようにしたい A0002:出力 A0011:出力されない A0100:出力 A0101:出力されない A0201:出力されない 何種類か記載しましたが、中には、すべて出力されたりします。
- pringlez
- ベストアンサー率36% (598/1630)
A0001 A0002 A0011 A0100 A0101 A0201 に対して「^A0+」を削除すると以下になります。 1 2 11 100 101 201 これで比較するのはどうでしょう。 どういう関数を使ってどう書いているのかわかりませんが、マッチングの関数を1回だけで処理しようとすると困難だし、できたとしてもわかりにくくなってメンテナンス性が下がると思います。 一度不要部分を削除(空文字にreplace)してから、マッチングもしくは数値に変換して比較などすれば比較的シンプルに実装できるのではないかと思います。
お礼
ありがとうございます。 参考にさせていただきます。
関連するQ&A
- 正規表現について
正規表現について質問をさせていただきます。 VB6.0にて正規表現を使用し、入力された文字のチェックを行っていますが どうしてもうまくいきません。 チェックしたい文字は A(半角アルファベット大文字1文字)または AAA(半角アルファベット大文字3文字)または (AAA)(半角カッコつき半角アルファベット大文字3文字)で 上記3パターン以外はエラーとしたいと思っています。 パターンは下記のように作成したのですが "(^[\(][A-Z]{3}[\)])|(^[A-Z]{1,3})" A、AAA、(AAA)以外でもA(AA)やAAAA等も正常ケースとして通過してしまいます。 パターンをどのように作成すればよいか教えて下さい。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- 正規表現メタ文字「-」のエスケープについて
いつもお世話になります。 正規表現のメタ文字のエスケープ処理を行いたいのですが、「-」の記号については、「[」「]」の中に出てきたときのみ([a-z]、[0-9]など)、エスケープの対象になります。 この場合、どのような正規表現を指定すれば、エスケープを行うことができるでしょうか。 例) [a-z|A-z] ⇒ [a\-z|A\-z] 宜しくお願いします。
- 締切済み
- Java
- 秀丸の正規表現
秀丸の正規表現 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
- 正規表現について教えて下さい
正規表現について教えて下さい $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
- 正規表現で
正規表現で、英大文字と記号だけからなる文字列、を表すにはどうすればよいでしょうか。言い方を変えると、とにかく英小文字は含まないという事なんですが… [^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のコマンドラインなら多少分かるのですが、プログラミングは さっぱりで、上記の目的につかえそうなユーティリティも探してみた のですが、見つけることはできませんでした。 よい方法がありましたら、ご教授よろしくお願いいたします。
- ベストアンサー
- その他([技術者向] コンピューター)
お礼
期待した結果が得られました。 ありがとうございます。 また、いろいろとお手数おかけしました。