「12a345a67.8」から正規表現で、「12」と「345a67.8」をキャプチャ取得したい

投稿者: Anonymous

対象

12a345a67.8
90a123a45
67.8a901a23.4

前提条件
・aの個数は「0」か「2」
・aが「0」の場合は何も処理しない


やりたいこと
・上記のような文字列がある時、「最初のaまで」と「それ以降」、もしくは、「最初のaまで」「2番目のaまで」「それ以降」をそれぞれ分離してキャプチャ取得したい

12a345a67.8の場合
・下記何れかの分離方式でキャプチャ取得したい
「12」「345a67.8」
「12a」「345a67.8」
「12」「345」「67.8」
「12a」「345a」「67.8」


試したこと
・最初のaまでキャプチャ取得

^(.*?)a

解決

言語依存の低い記述としては

^([^a]+a)([^a]+a)?(.+)$

でしょうか。2番目のaまでの部分について?とすることでマッチする場合は取り込み、しない場合は通過し「それ以降」に回すことができます。

この辺り、質問文が曖昧なので何を求めているのかうまく読み取れません。aが確実に2つ以上存在するのか1つの場合にも対処したいとしているのか、それとも技術的にハードルが高いと感じ2つ目以降のaを気にしなくてもよいと言っているのか、とか。aが3個以上存在する場合にはどうふるまってほしいのか、とか。


追記

  • aの個数は「0」か「2」
  • aが「0」の場合は何も処理しない

とのことですので、

^([^a]+)a(.+)$          // 「12」「345a67.8」
^([^a]+a)(.+)$          // 「12a」「345a67.8」
^([^a]+)a([^a]+)a(.+)$  // 「12」「345」「67.8」
^([^a]+a)([^a]+a)(.+)$  // 「12a」「345a」「67.8」

で十分でした。実は「何も処理しない」という前提条件もあいまいで、マッチに失敗してほしいのか、それとも全体を「最初のaまで」もしくは「それ以降」として扱ってほしいのか、解釈が分かれます。上記回答は「マッチしない」動作となります。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *