- 締切済み
正規表現: (111)-(222)-(333)
正規表現: (111)-(222)-(333) から (333)を取得したいと考えています。 ()で囲まれた数字のうち、最後のものを取得するというもので、 この、最後のという考えを実装することができずに困っています。 なぜ最後にこだわるかというと、以下のような例があるからです。 ◆ (111)english(222) ◆ (111)日本語(222)日本語 文字列中に含まれる()で囲まれた数字のうち、最後のものを取得する正規表現を教えてください。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- sholmes
- ベストアンサー率81% (89/109)
正規表現は処理系によって利用出来る記法が大幅に異なりますが、ここでは鬼車で動作確認済みの物を記載します。 # 行中最後の()内に数字のみが含まれているとき、その数字列を$1へ保持しておく正規表現 .*\((\d+)\).*$ # 対象文字列毎の動作例 (111) →$1 = 111 (A111) →$1 = null (111)-(222)-(333) →$1 = 333 (111)english(222) →$1 = 222 (111)日本語(222)日本語 →$1 = 222
- notnot
- ベストアンサー率47% (4900/10358)
何らかのプログラミング言語で使うのでしょうから、 .*\((.*)\) という正規表現でマッチさせて、カッコにマッチする部分を抜き出す・・・ 多くのスクリプト言語では $1 ・・・。
()で囲まれた数字のうち、最後のもの「だけ」を取得することは、多分正規表現だけでは無理です。その検索にはどうしても、「最後の数字から行末まで」という条件を追加しなければならないので、数字の後の文字列まで引っかかってしまいます。それでもよければ、以下の正規表現で可能です。 \([0-9]+\)[^(]*[^0-9]*[^)]*$ あくまでも最後の数字だけにしたい場合は、Perl・ruby・awkなどの文字列処理に強いスクリプト処理系のお世話にならなければ無理でしょう。
- morchin
- ベストアンサー率16% (212/1281)
私は正規表現マスターという訳でもないですが、最後のというのを一発で表現するのは難しいような気がします。 以下のどちらかの方法はどうでしょうか? 1) ()の個数が2個の場合と3個の場合を区別し、場合分けする。 2) 1段階目で()の最長マッチをし、2段階目で最後の()の部分を取得する。
- admiral_ya
- ベストアンサー率56% (110/193)
正規表現は、基本、最長一致なので、「^.*」等を使えば、「最後」の表現は簡単です。 ただ、「最後だけ」となると、 ・前の部分を除外する ・まさに最後だけにヒットさせる といった表現をする必要になります。 お尋ねの部分は、ここの部分かと思いますが、これは使っているツールによって異なるので、お使いのツールが解れば、他の方からフォローが気易いと思います。
> 以下のような例があるからです。 この例の両方ともが該当するのか、それとも前者だけが該当するのかで大幅に難易度が変わってきますが、どっちですか?
補足
レスいただきありがとうございます。 比重としては下側 (111)日本語(222)日本語 を意識しています。 文章中から拾いたいため、かならず最後になる保証は難しいためです。 よろしくお願いします。