正規表現
Rubyの正規表現についてまとめる
Rubyは文字列操作が得意
. | 任意の1文字(改行を除く) |
[..] | ..に含まれる任意の1文字 |
[^..] | ..含まれない任意の1文字 |
ひらがな1文字は[ぁ-ん]
カタカナ1文字は[ァ-ン] と表現できる。
[あいう]だと「あ」か「い」か「う」のどれかになる
[^あいう]だと「あ」「い」「う」どれでもないものになる
A* | Aの0回以上の繰り返し |
A+ | Aの1回以上の繰り返し |
A? | Aの1回以上の繰り返しの0回または1回の繰り返し |
A{m} | Aのm回の繰り返し |
A{m,} | Aのm回以上の繰り返し |
A{m,n} | Aのm回以上n回以下の繰り返し |
「おいしい+」だと、「おいしい」や「おいしいいいい」にマッチする。
全部最長一致のマッチングになるけど、「?」をつけると最短一致になる
「おいしい+?」だと、「おいしいいいい」の文字列中 「おいしい」がマッチする。
「おいしい+」の場合は、「おいしいいいい」の文字列中「おいしいいいい」がマッチする。
「おいしい{3}」では、「おいしいいいい」の文字列中「おいしいいい」(「い」が3回)にマッチする。
A|B | AまたはB |
/おいしい|まずい/だと「おいしい」か「まずい」にマッチする
\n | 改行 |
\t | タブ |
\w | 英数字、下線(半角) |
\W | 英数字、下線以外 |
\s | スペース、タブ、改行 |
\S | 空白、タブ、改行以外 |
\d | 数字 |
\D | 数字以外 |
\A | 文字列の冒頭 |
\z | 文字列の末尾 |
^ | 行頭 |
$ | 行末 |
\b | 文字列の境界 |
正規表現と文字列がマッチするかどうかを調べる
=~
test = "aaaabccc" if test =~ /abc/ puts "マッチした" else puts "マッチしない" end
結果:マッチした
正規表現でマッチした部分を取得(キャプチャ)する
$& | マッチした部分 |
$` | マッチした部分($&)よりも前の部分 |
$' | マッチした部分($&)よりも後ろの部分 |
正規表現を()でくくった場合
$1 | 1番目の()内の部分にマッチしたもの |
$2 | 2番目の()内の部分にマッチしたもの |
$n | n番目の()内の部分にマッチしたもの |
"123aaa456aaa" =~ /(\d+)\D+(\d+)/の場合
$1は123
$2は456 となる
最短マッチ
通常、正規表現で*や+を使用すると、最長マッチとなり思っているものと
違う部分がマッチしてしまうことがある。
例えば "aaabbbcccbbb" =~ /^.+b/ とすると
"aaab"がマッチすると思うが最長マッチとなるので、
実際は、"aaabbbcccbbb"がマッチする。
"aaab"とするには、繰り返し文字(+や*等)の後に?をつけてあげると、
最短マッチとなる。
"aaabbbcccbbb" =~ /^.+?b/ とすると、最短マッチとなり、
"aaab"がマッチする。
後方参照
\1、\2、\3・・・ 後方参照
関数(sub、gsub、scan)
sub
マッチした部分で最初の1か所だけ変換
”aaacccaaa".sub(/aaa/,"bbb") ⇒bbbcccaaa
aaaにマッチした部分で最初の1か所だけbbbに変換
gsub
マッチした部分をすべて変換
”aaacccaaa".gsub(/aaa/,"bbb") ⇒bbbcccbbb
aaaにマッチした部分を全部bbbに変換
$&や$1などを使うと固定じゃない文字列でも変換できる
text = "111は222の2分の1だ"
text1=text.gsub(/\d+/){"【#{$&}】"} puts text1 ⇒【111】は【222】の【2】分の【1】だ
数字にマッチした文字列に【】をつけた
scan
マッチした部分を要素とした配列を作成する
text = "2018年6月から2018年8月の間ダイエットする" text1=text.scan(/\d+年\d月/) puts text1 ⇒["2018年6月","2018年8月"]
今後も文字列操作で扱える良い情報があれば追加していこうと思う