tapitapi’s blog

1日1杯タピオカ!エンジニア

【ruby】Rubularで正規表現練習 第三回

いよいよ最終回!正規表現(以下Regex)について、下記サイトRubularで練習していきます。よろしくおねがいしまーす!

 

rubular.com

 

(一覧->*第一回第二回第三回第四回)

(...) :Capture everything enclosed(囲まれたものすべてを取得する)
(a|b) : a or b (a またはb)
a? : Zero or one of a (a が0個または1個)
a* : Zero or more of a (aが0個または1個以上)
a+ :One or more of a (aが1個以上)
a{3} :Exactly 3 of a (aがちょうど3個)
a{3,} :3 or more of a (aが3個以上)
a{3,6} :Between 3 and 6 of a (aが3個から6個)

 

 

1. (...)

Capture everything enclosed(囲まれたものすべてを取得する)

ってなんのこっちゃ???

実は、みなさん。これはRubularの隠しコマンド!!なのです。(嘘です。)

 

普通にRegex欄に/.../を、test string に「ルフィ ゾロ サンジ」といれると,見慣れた画面が出てきます。

f:id:kayo445:20200213213357j:plain

でも、RubularのRegex欄に/(...)/を、test string に「ルフィ ゾロ サンジ」といれると、、、

じゃじゃーん!

f:id:kayo445:20200213213439j:plain

あれ??なんか一つ欄が増えてる????

f:id:kayo445:20200213213507j:plain

そうです!マッチしたものすべてを取得することができるのです!

違うもので試してみましょう

Regex: /(^0[89]0-\d\d\d\d-\d\d\d\d$)/

テストサンプル:

080-1234-5678

090-1234-5678

080-1234-567890

080-dogs-cats

f:id:kayo445:20200213213542j:plain

これで、文字列のなかから電話番号だけを抜き出すことができますね!

 

実際には()はRubyでは使うことはなく、match()関数を使います。

 

たとえば

 

text = "080-1234-5678,090-1234-5678,080-1234-567890,080-dogs-cats"

 

このtextのように、電話番号っぽいものが羅列してあるtextがあって、本当に電話番号のものだけ取り出したいとき、

 

match = text.match(\b0[89]0-\d\d\d\d-\d\d\d\d\b)

 

とすると、matchは配列になっていて、中身は、

match[0]が080-1234-5678、

match[1]が090-1234-5678

となります!

 

2. (a|b)

aまたはbだったら、[ab]で良いのですが、もっと長い文字の場合は、縦棒"|"の出番です!さらに括弧()がついているので、マッチしたものをとりだせます

 

Regex: /(女性|female)/

テストサンプル:

Emma female

John male

花子 女性

f:id:kayo445:20200213213730j:plain

これで、女性が何名いるか調べられます!

 

3.a?

a が0個または1個

Regex: /ポケット・?モンスター|ポケモン/

テストサンプル:

きたー!ポケモン最新作
来週FF発売日?
ポケットモンスター劇場版見てきました
いつも心にポケット・モンスター

f:id:kayo445:20200213213909j:plain

ポケモン関連のテキストがマッチしていることが分かります。

 

4.a*

aが0個または1個以上

Regex: /ポケット!*モンスター|ポケモン/

テストサンプル:

きたー!ポケモン最新作
来週FF発売日?
ポケットモンスター劇場版見てきました
いつも心にポケット!!!!モンスター

f:id:kayo445:20200213213938j:plain

 

5.a+

aが1個以上

Regex: /TOKIO:(.+)/

テストサンプル:

TOKIO:城島
TOKIO:
TOKIO:国分

f:id:kayo445:20200213214001j:plain

空欄の名前は省いて取得できます。もし*を使うと、空欄の名前もマッチしてしまいます

Regex: /TOKIO:(.*)/

テストサンプル:

TOKIO:城島
TOKIO:
TOKIO:国分

f:id:kayo445:20200213214402j:plain

 

6.a{3}

aがちょうど3個

前は(^0[89]0-\d\d\d\d-\d\d\d\d$)と書いていたものを、カッコよくできます

 

Regex: /(^0[89]0-\d{4}-\d{4}$)/

テストサンプル:

080-1234-5678

090-1234-5678

080-1234-567890

080-dogs-cats

f:id:kayo445:20200213214031j:plain

 

7.a{3,}

aが3個以上. お気づきかと思いますが、a{,3}でaが3個以下という意味になります

 

いままでは080か090で始まる携帯電話を考えていましたが、0120-000-000系の電話番号もヒットさせたい!!

Regex: /(^0\d{,3}-\d{,4}-\d{,4}$)/

テストサンプル:

080-1234-5678

0120-123-456

080-1234-567890

080-dogs-cats

f:id:kayo445:20200213214124j:plain

 

8.a{3,6} 

aが3個から6個

もっと電話番号検索を精度よくできそうです

 

Regex: /(^0\d{2,3}-\d{3,4}-\d{3,4}$)/

テストサンプル:

080-1234-5678

0120-123-456

08-1-5890

080-dogs-cats

f:id:kayo445:20200213214313j:plain

 

やったー!Regex終わったーーーーー!!!

 

あれ??なんだこれ????

f:id:kayo445:20200213214227j:plain

おぷしょん、、、、だと?????

 

ということで次回、正規表現番外編!を行います!

次こそ本当の最終回。(であってほしい。)

 

今日はここまで。

おやすみなさいいいいぃぃぃ