【GAS GoogleAppsScript | 基礎コード】正規表現を扱うRegExpオブジェクト・Stringオブジェクト

スポンサーリンク

正規表現を扱うRegExpオブジェクト

正規表現とは

正規表現とは、文字列のパターンを表現するための方法です。以前にスプレッドシートのクエリ関数の記事でも紹介させてもらったことがありますが、

a~Z、0~9などの通常の文字と、[]や{}などの特殊な役割を持つ「メタ文字」と言う記号の組み合わせでパターンを表現します。

分かりにくいと思うので、早速ですがよく使われる正規表現の記号の一覧です。

よく使われる「正規表現」の記号

記号意味正規表現の例マッチする文字列例
.任意の1文字.a , b, c なんでも
?0回または1回の出現ab?cdacd → 0回 abcd → 1回
*0回以上の繰り返しの出現ab*cdacd → 0回 abcd → 1回 abbcd → 2回  abbbcd → 3回  abbbb・・・cd → 4回以上何回でも
+1回以上の繰り返しの出現ab+cdabcd → 1回 abbcd → 2回  abbbcd → 3回  abbbb・・・cd → 4回以上何回でも
{n}n回の繰り返しの出現ab{3}cdabbbcd → 3回 
{n,}n回以上の繰り返しの出現ab{3,}cdabbbcd → 3回 abbbbcd → 4回 abbbbbcd → 5回 abbbbbb・・・cd → 5回以上何回でも
{m,n}n回以上m回以下の繰り返しの出現ab{3,4}cdabbbcd → 3回 abbbbcd → 4回
^文字列の先頭^abcdabcd~ → abcで始まる
$文字列の末尾abcd$abcd → abcdで終わる
||の左側の文字列もしくは、|の右側の文字列a(b|c)dabd acd
 \wアルファベット、アンダーバー、数字ab\wcdabgcd ab_cd ab9cd ab[a-zA-Z_0-9]cdと同じ
\Wアルファベット、アンダーバー、数字以外の文字ab\Wcdabcd abcd ab[^a-zA-Z_0-9]cdと同じ
\s空白文字(半角スペース,タブ,改行,キャリッジリターン)ab\scdab cd ※半角スペース
\S空白文字以外ab\Scdabgcd ab9cd
\d半角数字(0~9)ab\dcdab8cd ab5cd
\D半角数字以外ab\Dcdabmcd abcd
[~]~のいずれかの1文字ab[cde]fgabcfg abdfg abefg
[^~]~のいずれの1文字にも一致しないab[^cde]fgabafg abbfg abffg ab1fg

※他にもたくさんありますので興味のある方はググったり本を買ったりして勉強して下さい!

このような、記号を組み合わせて文字列のパターンを作成し、そのパターンにマッチした文字列を検索するために使います。

要するに、「超便利なあいまい検索」って感じですね^_^

RegExpオブジェクト

RegExpオブジェクトは、上で説明したような、正規表現を扱うオブジェクトです。

以下のように、new演算子によってインスタンスを生成することが出来ます。

構文

変数名 = new RegExp("正規表現" [, "フラグ" ])

また、正規表現は次のように「/」スラッシュで囲むことによる、正規表現リテラルで表記することが出来ます。

構文

変数名 = / 正規表現 / フラグ

一般的にはこちらで書く場合が多いみたいですね。

※スラッシュ自体を正規表現内で使う場合は、「\/」としてエスケープする必要があるので注意してください。

「フラグ」は次の表のように、検索時に機能するオプションの指定です。フラグを複数設定したい場合は、giなどとして並べて指定することも出来ます。

フラグ説明
gグローバルサーチ、最初のマッチで止まらずに全てのマッチを探す
i大文字・小文字を区別しない
m複数行を検索する

RegExpオブジェクトの主なメンバー

分類 メンバー 説明
メソッド exec(str) 文字列に対して正規表現で検索して配列で返す
メソッド test(str) 文字列に対して正規表現での検索テスト結果を真偽値で返す
メソッド toString() 正規表現を文字列で返す
プロパティ lastindex 次のマッチが始まる位置
プロパティ global gフラグの真偽値
プロパティ ignoreCase iフラグの真偽値
プロパティ multiline mフラグの真偽値
プロパティ source 正規表現パターンのてテキスト部

使い方

それでは、サンプルコードで、どんな動きになるのか確認しましょう!

まずは、基本のものです。

function test(){

  // 検索対象の文字列指定
  var str = "My name is Tom. His name is Jon."
 
  // インスタンスの生成
  var reg = /.o./g
  
  // ログに出力
  
  // 正規表現 「.o.」 がマッチする文字列を配列で返す(execは最初のマッチのみ)
  Logger.log(reg.exec(str))  // [Tom]
  
  // 正規表現が文字列にマッチするかどうかを真偽値で返す
  Logger.log(reg.test(str))  // true
  
  // 正規表現を文字列で返す
  Logger.log(reg.toString(str))  // /.o./g
  
  // 正規表現パターンのテキスト部分
  Logger.log(reg.source)  // .o.
  
  // 次のマッチが始まる位置(マッチするものは全て調べた後)
  Logger.log(reg.lastIndex)  // 31.0
  
  // gフラグの真偽値
  Logger.log(reg.global)  // true
  
  // iフラグの真偽値 
  Logger.log(reg.ignoreCase)  // false
  
  // mフラグの真偽値
  Logger.log(reg.multiline)  // false
  
}

Stringオブジェクトで正規表現を使う

正規表現にマッチした文字列を配列で返す

正規表現にマッチした文字列をまとめて取得するためには、Stringオブジェクトのmatchメソッドを使う方法もあります。

構文

Stringオブジェクト.match( 正規表現 )

サンプルで確認します。

function test(){

  // 検索対象の文字列指定
  var str = "My name is Tom. His name is Jon."
  
  // ログに出力
  
  // Stringオブジェクトのmatchメソッドで、
  // 正規表現にマッチした文字列を配列で返す
  // gフラグを付ける
  var reg = /.o./g
  Logger.log(str.match(reg))  // [Tom, Jon]
  
  
  // Stringオブジェクトのmatchメソッドで、
  // 正規表現に最初にマッチした文字列を配列で返す
  // gフラグを付けない
  var reg = /.o./
  Logger.log(str.match(reg))  // [Tom]
  
}

このようにすることで、正規表現にマッチした文字列を、返すことが出来ます。

正規表現による文字列の置換と分割

また、Stringオブジェクトのreplaceメソッドを使うことで、正規表現にマッチした文字列の置換が出来、splitメソッドを使うことで、文字列の分割をすることが出来ます。

replaceメソッドの構文

Stringオブジェクト.replace( 正規表現, 置き換え後の文字列 )

サンプルコード

function test(){

  // 検索対象の文字列指定
  var str = "My name is Tom. His name is Jon."
  
  var reg = /.o./g

  // replaceメソッドで文字列の置き換え
  Logger.log(str.replace(reg, "hirachin"))  // My name is hirachin. His name is hirachin.
  
}

splitメソッド構文

Stringオブジェクト.splitメソッド( 正規表現 )

サンプルコード

function test(){

  // 検索対象の文字列指定
  var str = "My name is Tom. His name is Jon."
  
  var reg = /\s/g   //・・・ 空白文字列

  // splitメソッドで文字列を分割する
  Logger.log(str.split(reg))  // [My, name, is, Tom., His, name, is, Jon.]
  
}

まとめ

正規表現を使って文字列を操作する方法について紹介しました!これを使え文字列に対していろいろな処理が出来るのですが、なんせ正規表現は奥深いです。正規表現だけを取り上げたタイトルで本が何冊も出ているくらいの項目です。まずは簡単なことから初めて徐々に慣れていきましょう!もっと深く学びたい!という方は書籍がいっぱい出ていますので読んでみてください^_^