kansiho's blog

ruby, python, javascript. Rails, wordpress, OpenCV, heroku...

よくつかう正規表現

正規表現は、ある文字の並び(文字列)を表現する一つの方式です。正規表現はそもそも、人の神経系がどのように機能しているかの研究において開発され、UNIX の中心的な考案者 Ken Thompson によってコンピュータでの検索アルゴリズムに組み込まれたことから始まったものです。メールアドレスのバリデーションなんかによく登場しますが、プログラミング言語をつくるとき、トークンに区切るためにも正規表現をつかったりします。

https://qiita-image-store.s3.amazonaws.com/0/7465/4f7892dd-4459-47ed-4a69-4568d17423b1.jpeg

正規表現のきほん

代表的な正規表現上の特殊文字(=メタキャラクタ)を紹介しています。

例はRubyで、正規表現のパターン(pattern)にマッチした全ての部分を文字列(replacement)に置換して返す関数gsubを使って表示しています。

位置で指定する

^

先頭。

str = '1235AABBB'
str.gsub(/^123/, '')
#  => "5AABBB"  123がマッチして消えている(''と置き換えられている)

$

行末。

str = '1235AABBB'
str.gsub(/BBB$/, '')
=> "1235AA"

個数で指定する(直前の表現が何回現れることが許されるかを指定することを量化という)

*

直前に指定された文字の 0 回以上の繰り返し。

str = '1235AABBB'
str.gsub(/B*/, '')
=> "1235AA"

str.gsub(/1*/, '')
=> "235AABBB"

+

直前に指定された文字の 1 回以上の繰り返し。

str = '1235AABBB'
 str.gsub(/A+/, '')
=> "1235BBB"
str.gsub(/N+/, '')
=> "1235AABBB"

{n}

直前に指定された文字の n 回の繰り返し。

str = '1235AABBB'
 str.gsub(/A{2}/, '')
=> "1235BBB"
str.gsub(/A{3}/, '')
=> "1235AABBB"

[abc] もしくは [a-c]

a、b、または c

str = '1235AABBB'
str.gsub(/[A,B,C]/,'')
=> "1235"
str.gsub(/[A-C]/,'')
=> "1235"
 pry(main)> str.gsub(/[1-2]/,'')
=> "35AABBB"

[^abc]

a,b,c 以外の文字

str = '1235AABBB'
str.gsub(/[^1-2]/,'')
=> "12"

.

任意の文字

str = '1235AABBB'
 str.gsub(/./,'')
=> ""
str.gsub(/^1./,'')
=> "35AABBB"
str.gsub(/^1.../,'')
=> "AABBB"
 str.gsub(/^1.{3}/,'') # {n}との合わせ技
=> "AABBB"

ab以外の文字が存在しなくて、かつ、 aが偶数個で、bが奇数個の行を検索する

こみいった問題に対処してみる。。

a が奇数個含まれている、{a,b}の2種類の文字で構成された文字列

bが置かれる可能性のある場所にb*(bが0個以上)を置けば良い。

bの存在をワイルドカードで無視した時に、「aが偶数個」になるように区切れる場所が0 個以上あって、その区切り以降に、さらに1個のaがあることを保証できればよい。

str
=> "aabbab"
str.gsub(/b*(ab*ab*)*ab*/,'') 
=> "" # 全てに一致

参考

stackoverflow.com

正規表現の由来