正規表現(Regular expression)について学習したので、備忘録も兼ねてまとめます。
記載に誤りなどございましたら、ご指摘いただけますと幸いです。
*新たに学習したことなどあり次第、更新いたします。
正規表現とは
文字列に特定の文字が含まれているかの確認や特定の文字を取り除くなどの操作を行うための技術。
主に下記のケースで使用される。
-文字列における一部分の置換
-文字列が制約を満たしているか確認
-文字列における一部分を抽出
*正規表現は様々な言語で同じようなコードで表すことができるように設計されているため、ほとんどの記述をRubyやJavaScriptなどの別言語間でも共有することができます。
正規表現で使用するメソッド
1.subメソッド
2.matchメソッド
3.splitメソッド
以下で、詳細・使用方法を説明していきます。
1.subメソッド
使用目的:文字列における一部分の置換
*第一引数に置き換えたい文字列を指定(/で囲む)し、第二引数に変換後の文字列を指定。
*第二引数を空欄にすれば、第一引数の部分が削除されます。
(スペースを削除する場合は(' ',' ')という記述となり、/は不要となります。
*.upcase /.downcaseを使用することで、大文字小文字の変更も可能です。
*グローバルマッチ 'g'
文字列内で指定した文字が複数含まれている場合、その全てを置換するという意味になります。
gsubではなくsubを使用した場合、初めの1つだけ置換されます。
tel = '000-1234-5678' =>出力:'000-1234-5678'
tel.sub(/-/,'') => 出力:'0001234-5678' 最初のハイフンしか置換(削除)されない。
tel.gsub(/-/,'') =>出力:'00012345678' 全てのハイフンが置き換え(削除)される。
2.matchメソッド
使用目的:文字列が制約を満たしているか確認/文字列における一部分を抽出
*指定した文字列が含まれている場合は、MatchDataオブジェクトの返り値で得られます。
含まれていない場合は、返り値としてnilが得られます。
*MatchDataオブジェクト:
正規表現のマッチに関する情報を扱うためのオブジェクト。
マッチした文字列等をMatchDataオブジェクトで返します。
MatchDataオブジェクトから文字列等を取り出す際は、以下の様に配列からデータを取り出す時と同様の形で取り出すことができます。
md=[数字]で取り出せます。(-1と入力した場合は、最後にマッチしたものが出力されます。)
記載方法
if "Do you like cats?".match(/like/)
puts "Match found!"
end
|文字列|意味|
|:--:|:--:|:--:|
|[a-z] |括弧で囲まれた文字のいずれか1個|
|\d|数字|
|{n,m} |直前の文字が最低n回、最大m回出現するもの|
|.|どの1文字でも|
|+|直前の文字の1回以上の繰り返し|
|i|大文字・小文字を区別しない検索*最後につけます。|
*他にも色々とありますが、割愛させていただきます。
3.splitメソッド
使用目的:対象とする文字列区切り文字ごとに分割して出力。
sample = "AAA,BBB,CCC" =>出力:"AAA,BBB,CCC"
sample.split(/,/)[2] =>出力:"CCC"
その他
Javascriptにおけるバックスラッシュ''について
まず、Javascriptにおける正規表現オブジェクトの生成方法について。
生成方法は以下のようになってます。
1.コンストラクタ関数 RegExp()を用いる
2.「/(スラッシュ)」を使って正規表現を囲む「リテラル表現」を用いる
1)コンストラクタ関数 RegExp()を利用
let url = new RegExp('https?://example\.com');
2)リテラル表現を利用
let url = /https?:\/\/example\.com/;
2のリテラル表現では、「/」以外はデリミタとして認められません。
上記のように正規表現ではスラッシュをエスケープする必要が生じます。
ここでバックスラッシュを活用します。
正規表現では、まず特殊文字が正規表現として評価されます、ドットの場合、任意の 1 文字に一致すると解釈されます。
正規表現 1. = 11 = 1A
正規表現 1.1 = 111 = 1A1
ここで、正規表現で「0.0.0.0」を抽出したい場合に、今まで同様に記載すると以下のようになってしまいます。
正規表現 0.0.0.0 = 0102030 = 0a0b0c0
ドット'.'を任意の文字と一致させるのに使用する特殊文字ではなく、そもそもの区切り記号として認識させるには、
バックスラッシュ(\)を使用することで解決できます。
0.0.0.0 に一致する正規表現は次のようになります。
正規表現 0\.0\.0\.0 = 0.0.0.0
*デリミタ:複数要素を列挙する際に、要素の区切りとなる記号や特殊文字(の並び)のこと。
以上となります。最後までご覧いただき、ありがとうございました!
今後も学習した事項に関してQiitaに投稿していきますので、よろしくお願いします!
記述に何か誤りなどございましたら、お手数ですが、ご連絡いただけますと幸いです。
参考
Javascript での正規表現の記述方法
http://www-creators.com/archives/4488
ドット(.)とバックスラッシュ(\)
https://support.google.com/analytics/answer/1034332?hl=ja