LoginSignup
3
1

More than 3 years have passed since last update.

ruby subメソッドで使用した正規表現について

Last updated at Posted at 2020-05-26

正規表現がうまく行かない

address="都道府県,市区町村,番地,建物名部屋番号"

という変数があり、ここから、番地を取得したいとします。
結論からいうと、

address.split(",")[2]

ですが、
正規表現でチャレンジしました。

まずはsubで、先頭の「都道府県,」を消して、それを2回繰り返そうと思いました。
のこった「番地,建物名部屋番号」から、「,」以降を消して終わりです。

まずは1回だけのバージョンでテスト

address.sub(/.+,/,'')

「都道府県,」のみが消える予定です。

結果
"建物名部屋番号"
となっちゃいました。

/.+,/の部分が「都道府県,」になるだろうと予測したのですが、
「都道府県,市区町村,番地,」になっちゃいます。

試しに

address.sub(/,/,'')

としてみると
「都道府県市区町村,番地,建物名部屋番号」
となり、最初の1個目をちゃんとけしてくれます。

なぜに???

・・・・・
まぁ番地のみ取得という問題は解決しているので
そういうもんだろうと今は割り切って次に進みます。
まだまだ、勉強中なもので、、、
今後勉強していけば、この疑問も晴れるかも、、、
よかったら誰か教えてTT

解答の一例ができたので以下に

address.sub(/[^,]+,/,'')

簡単に [^,]+, を解説

 [^,] で , 以外の文字となります。例として、 [^A] でA以外の文字です。
 [^,]+ で , 以外の文字が一文字以上です。 [^A]+ でA以外の文字が一文字以上です。
 [^,]+, で , 以外の文字が一文字以上続いた後に , です。
 [^A]+, でA以外の文字が一文字以上続いた後に , です。

最初の .+, は、任意の文字が続いた後に , だったので 都道府県,市区町村,番地, になっていました。
 , も任意の文字と捉えられていたので、この結果だったと思います。
そこで , 以外の文字としたことで、 都道府県, になったと思います。

こちらがとてもわかり易かったのでご紹介です^^
初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」
初心者歓迎!手と目で覚える正規表現入門・その2「微妙な違いを許容しつつ置換しよう」

記事のご紹介ありがとうございました^^

3
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1