- ベストアンサー
正規表現で末尾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」といったデータが抽出されます。
- みんなの回答 (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% (6803/9674)
>期待した結果になりませんでした。 >いろいろ、 >ご協力いただきありがとうございます。 ちょっと待ってください、私は本当の意味であなたの質問に一度も答えていません。 質問本文の例示は間違っているのですよね? で、回答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% (6803/9674)
>実際は、 > >A0001:除外したいものなので出力されないようにしたい >A0002:出力 >A0011:出力されない >A0100:出力 >A0101:出力されない >A0201:出力されない すみませんがその例も分かりません。 A0011は出力されるはずでは。 まあ、下01を出力したくなければ、 A\d\d(?!01)$ でどうですか。 ※ \d は [0-9] と同一です。(覚え方: decimalのd)
お礼
期待した結果になりませんでした。 いろいろ、 ご協力いただきありがとうございます。
- asciiz
- ベストアンサー率70% (6803/9674)
>以下の様なデータから末尾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)してから、マッチングもしくは数値に変換して比較などすれば比較的シンプルに実装できるのではないかと思います。
お礼
ありがとうございます。 参考にさせていただきます。
お礼
期待した結果が得られました。 ありがとうございます。 また、いろいろとお手数おかけしました。