LogoMark.png

RegularExpression の変更点


#author("2021-07-27T22:12:59+09:00;2020-02-29T17:21:05+09:00","default:inoue.ko","inoue.ko")
*正規表現
Regular Expression
~
正規表現(Regular Expression)とは、文字列中の「パターン」を表現する記述方法です。このパターン記述ができると、パターンに一致する複数の文字列を、シンプルに操作できるようになります。

~

**正規表現の基本
正規表現によるパターンは''「通常の文字(リテラル)」''と''「メタ文字(特殊な役割を与えられた記号)」''を組み合わせて記述します。
~

***リテラル
 abc、12345、日本語 ・・・ など通常の文字列
~

***メタ文字
 .   ^   $   [   ]   *   +   ?   {n,m}   |   (   )
~

***正規表現の例
-「九州」で始まる文字列
 ^九州.*

-「である。」で終わる文字列
 .*である。$

-「〇〇cm」の形で書かれた数値
 [0-9]+cm

~
~

**正規表現の事例

***任意の1文字:.
-パターン
  ....は600円
-マッチする文字列
 ラーメンは600円。
 焼肉定食は600円です。
~

***行頭の文字列を指定:^
-パターン
 ^緊急
-マッチする文字列
 緊急電話, 緊急対策会議
~

***行末の文字列を指定:$
-パターン
  ある。$
-マッチする文字列
 ・・・である。,  ・・がそこにある。
~

***指定文字のいずれか:[ ]
-例1
--パターン
 明日は[晴曇雨]です。
--マッチする文字列
 明日は晴です。,  明日は曇です。, 明日は雨です。
-例2:アルファベット大文字がそこに含まれる
--パターン
 A[A-Z]CDEFG 
--マッチする文字列
 AACDEFG, ABCDEFG, ・・・, AZCDEFG
-例3:アルファベット大文字以外がそこに含まれる
--パターン
 A[^A-Z]CDEFG
--マッチする文字列
 A0CDEFG, AnCDEFG,  A+CDEFG など

~

***直前の文字の0回以上の繰り返し: *  
直前の文字がないか、直前の文字が1個以上連続する場合に合致
-パターン
 わー*い
-マッチする文字列
 わい,  わーーい,  わーーーーい
-参考
 .*
なんでもあり・・となります。正規表現の最後に .* が来た場合は、行末まで合致することになります。
~

***直前の文字の1回以上の繰り返し: + 
上記 * と基本的に同じですが、少なくとも1個は + の直前の文字が必要。
-パターン
 わー+い
-マッチする文字列
 わーい,  わーーい,  わーーーーい
~

***直前の文字の0回か、1回の繰り返し: ?
直前の文字がないか1つだけあるという意味です。 これ結構使えます。

-例1
--パターン
 わー?い
--マッチする文字列
 わい,  わーい

-例2
--パターン
 090-?1234-?5678
--マッチする文字列
 09012345678 , 090-1234-5678 , 090-12345678 , 0901234-5678

-例3
--パターン
 jpe?g
--マッチする文字列
 jpg ,  jpeg
~


***直前の文字の繰り返しの回数の指定( {n,m} )
-パターン
 OK!{1,6}
-マッチする文字列
 OK!
 OK!!
 OK!!!!!!
~

***論理和(または): |
-パターン
 (醤油|味噌|塩|豚骨)ラーメン
-マッチする文字列
 醤油ラーメン, 味噌ラーメン, 塩ラーメン, 豚骨ラーメン, 
~

***サブパターン:()
カッコ内のパターンにマッチした文字列を後方参照
-例1
--パターン
 今日は(5時|深夜)に帰宅します 
--マッチする文字列
 今日は5時に帰宅します,   今日は深夜に帰宅します 
-例2
--パターン
  (じゃ)+ーん 
--マッチする文字列
 じゃーん,   じゃじゃーん, ・・   ,  じゃじゃじゃじゃーん
~
~

**特殊な記号
***エスケープシーケンスについて
正規表現においてメタ文字(特別な意味を持つ記号そのもの)を照合対象とする場合にどうするか・・。そのとき用いられるのがエスケープシーケンスと呼ばれる「\(バックスラッシュ)」を用いた記述です。

メタ文字の直前にバックスラッシュを配置することで、直後のメタ文字を通常の文字として認識させることができます。以下の例では、メタ文字 [ . ] の前にバックスラッシュを書いて [ \. ] と表記することで照合させています。
-パターン
 example\.com
-マッチする文字列
 example.com

//***参考:デリミタのエスケープ
//デリミタ(後述)をリテラルとして照合する場合にも、その文字をエスケープする必要があります。以下の例では、デリミタ [ / ] の前にバックスラッシュを書いて [ \/ ] と表記することで照合させています( [ ? ]  は「直前の文字がないか1つだけある」を意味しています)。
//-パターン
// https?:\/\/example\.com
//-マッチする文字列
// https://example.com
// http://example.com

~

***デリミタについて
デリミタ(Delimiter)とは、実際のプログラミング等において、パターンの範囲を明示すべくその両端を囲む半角文字記号のことです。デリミタには [ / , { }, #, @ ] など、様々な記号が用いられます。

-JavaScript|match() 関数など
JavaScriptでは、デリミタに [ / ] を使います(以下、例)。
 let pattern = /ab+c/ ;
以下のようにして生成することも可能です。
 let pattern = new RegExp('ab+c');

-PHP|preg_match() 関数など
英数字、バックスラッシュなど、空白文字以外の任意の文字をデリミタとして使うことができます。よく使われる文字は、[ /(スラッシュ)]、 [ #(ハッシュ記号)] および [ ~(チルダ)] です(以下例)。
 /foo bar/
 #^[^0-9]$#
 +php+
 %[a-zA-Z0-9_-]%
括弧をデリミタを使うことも可能です。  ( )、 { }、[ ]  また < > など、開閉括弧がそれぞれ開始デリミタ、終了デリミタとなります。
~

***デリミタの使い分け
例えば URL など、パターン内にメタ文字である [ /(スラッシュ)] 文字が出現するケースでは、デリミタには [ / ] ではなく、[ # ] などを使うのがよいでしょう。例えば、/images/sample.jpg は・・ 

-デリミタに [ / ] を使った場合、パターンに含まれる [ / ] をリテラル化するために [ \ ](バックスラッシュ)によるエスケープ(回避)が必要になります。
 $ptn = '/\/images\/sample.jpg/';
&small( [ \ ] は、Macの場合 [ option ] + [ ¥ ] で表示されます。);
-デリミタに#を使えば、スラッシュのエスケープが不要になります。
 $ptn = '#/images/sample.jpg#';
~
~

**APPEDIX
***正規表現チェッカー
記述したパターンで、正しく対象を照合できるかチェックできます。
-http://okumocchi.jp/php/re.php
対応言語:PHP, Javascirpt
-https://www.debuggex.com/
対応言語:PHP, Javascirpt, Python
~

***正規表現サンプル集
-https://www.megasoft.co.jp/mifes/seiki/meta.html (メタ文字一覧)
-https://www.megasoft.co.jp/mifes/seiki/(検索サンプル)
-https://www.megasoft.co.jp/mifes/seiki/index_r1.html(置換サンプル)

~
~