正規表現を扱うRegExpオブジェクト
正規表現とは
正規表現とは、文字列のパターンを表現するための方法です。以前にスプレッドシートのクエリ関数の記事でも紹介させてもらったことがありますが、
a~Z、0~9などの通常の文字と、[]や{}などの特殊な役割を持つ「メタ文字」と言う記号の組み合わせでパターンを表現します。
分かりにくいと思うので、早速ですがよく使われる正規表現の記号の一覧です。
よく使われる「正規表現」の記号
記号 | 意味 | 正規表現の例 | マッチする文字列例 |
---|---|---|---|
. | 任意の1文字 | . | a , b, c なんでも |
? | 0回または1回の出現 | ab?cd | acd → 0回 abcd → 1回 |
* | 0回以上の繰り返しの出現 | ab*cd | acd → 0回 abcd → 1回 abbcd → 2回 abbbcd → 3回 abbbb・・・cd → 4回以上何回でも |
+ | 1回以上の繰り返しの出現 | ab+cd | abcd → 1回 abbcd → 2回 abbbcd → 3回 abbbb・・・cd → 4回以上何回でも |
{n} | n回の繰り返しの出現 | ab{3}cd | abbbcd → 3回 |
{n,} | n回以上の繰り返しの出現 | ab{3,}cd | abbbcd → 3回 abbbbcd → 4回 abbbbbcd → 5回 abbbbbb・・・cd → 5回以上何回でも |
{m,n} | n回以上m回以下の繰り返しの出現 | ab{3,4}cd | abbbcd → 3回 abbbbcd → 4回 |
^ | 文字列の先頭 | ^abcd | abcd~ → abcで始まる |
$ | 文字列の末尾 | abcd$ | ~abcd → abcdで終わる |
| | |の左側の文字列もしくは、|の右側の文字列 | a(b|c)d | abd acd |
\w | アルファベット、アンダーバー、数字 | ab\wcd | abgcd ab_cd ab9cd ab[a-zA-Z_0-9]cdと同じ |
\W | アルファベット、アンダーバー、数字以外の文字 | ab\Wcd | abあcd ab青cd ab[^a-zA-Z_0-9]cdと同じ |
\s | 空白文字(半角スペース,タブ,改行,キャリッジリターン) | ab\scd | ab cd ※半角スペース |
\S | 空白文字以外 | ab\Scd | abgcd ab9cd |
\d | 半角数字(0~9) | ab\dcd | ab8cd ab5cd |
\D | 半角数字以外 | ab\Dcd | abmcd abKcd |
[~] | ~のいずれかの1文字 | ab[cde]fg | abcfg abdfg abefg |
[^~] | ~のいずれの1文字にも一致しない | ab[^cde]fg | abafg abbfg abffg ab1fg |
※他にもたくさんありますので興味のある方はググったり本を買ったりして勉強して下さい!
このような、記号を組み合わせて文字列のパターンを作成し、そのパターンにマッチした文字列を検索するために使います。
要するに、「超便利なあいまい検索」って感じですね^_^
RegExpオブジェクト
RegExpオブジェクトは、上で説明したような、正規表現を扱うオブジェクトです。
以下のように、new演算子によってインスタンスを生成することが出来ます。
また、正規表現は次のように「/」スラッシュで囲むことによる、正規表現リテラルで表記することが出来ます。
一般的にはこちらで書く場合が多いみたいですね。
※スラッシュ自体を正規表現内で使う場合は、「\/」としてエスケープする必要があるので注意してください。
「フラグ」は次の表のように、検索時に機能するオプションの指定です。フラグを複数設定したい場合は、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メソッドを使う方法もあります。
サンプルで確認します。
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メソッドを使うことで、文字列の分割をすることが出来ます。
サンプルコード
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.
}
サンプルコード
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.]
}
まとめ
正規表現を使って文字列を操作する方法について紹介しました!これを使え文字列に対していろいろな処理が出来るのですが、なんせ正規表現は奥深いです。正規表現だけを取り上げたタイトルで本が何冊も出ているくらいの項目です。まずは簡単なことから初めて徐々に慣れていきましょう!もっと深く学びたい!という方は書籍がいっぱい出ていますので読んでみてください^_^
コメント