正規表現
今回はオフィススクリプトにおける正規表現の体系的な使用方法について解説します。
正規表現の定義
Section titled “正規表現の定義”Office スクリプトで正規表現を使用する場合、スラッシュで囲った正規表現リテラル(/.../)を定義するか、 RegExpオブジェクトを使用します。
どちらも同じRegExpオブジェクトが作成されますが、正規表現内に変数を使用したい場合や、ユーザーからの入力を元に正規表現を動的に生成する場合は、RegExpコンストラクタ(new RegExp())を使用する必要があります。
/** 2桁の数字にのみマッチする正規表現 */const regexp1 = /^[0-9]{2}$/;
/** 「value」から始まる文字列にマッチする正規表現 */const regexp2 = new RegExp(`^value.*`);正規表現と文字列の一致チェック
Section titled “正規表現と文字列の一致チェック”RegExp.test メソッドを使用した場合
Section titled “RegExp.test メソッドを使用した場合”単純に正規表現と指定された文字列が一致するかを調べるだけであれば、RegExp.testメソッドを使用します。
RegExp.testは引数に文字列を指定し、正規表現と一致していれば true、一致しなければ false を返します。
/** 2桁の数字にのみマッチする正規表現 */const regexp = /^[0-9]{2}$/;
console.log(regexp.test('23')); // true
console.log(regexp.test('2022')); // falseString.search メソッドを使用した場合
Section titled “String.search メソッドを使用した場合”String.searchメソッドでも、文字列の一致チェックを行えます。
String.searchは引数に正規表現を渡すことができ、最初に一致した位置のインデックス(0 から始まる位置)を返します。一致しなかった場合は -1 を返します。
/** 文字列中に2桁の数字があればマッチする正規表現 */const regexp = /[0-9]{2}/;
console.log('本日は17日です'.search(regexp)); // 3(4文字目から一致)以下で、パターンや対象の文字列、メソッドを切り替えて結果を確かめられます。testとsearchは、2 箇所以上一致していても最初の一致だけを使う点に注目してください。
一致した箇所2 箇所
本日は17日、明日は18日です
- メソッドが使う一致
- 使われない一致
結果target.search(/[0-9]{2}/)3
パターンが正しくありません:
パターンや文字列を変えて、一致する箇所と結果を確かめてみましょう。
正規表現を使った文字列の置換
Section titled “正規表現を使った文字列の置換”正規表現にマッチする文字列を別の文字列と置き換えるには、String.replaceメソッドの引数に正規表現を使用します。
/** 先頭の「value」 */const regexp = new RegExp('^value');
const replaced = 'value-content-value'.replace(regexp, 'item'); // item-content-valuegフラグを付けない場合、置換されるのは最初にマッチした 1 箇所のみです。
正規表現リテラルの末尾にgを付けた場合(/value/g)は、対象文字列全体を通してマッチする文字列を探し、マッチしたすべての箇所が置換されます。RegExpコンストラクタを使う場合は、第二引数にフラグを指定します(new RegExp('value', 'g'))。
gフラグの有無を切り替えて、置き換わる箇所の違いを確かめてみましょう。
一致した箇所2 箇所
value-content-value
- メソッドが使う一致
- 使われない一致
結果target.replace(/value/, 'item')'item-content-value'
- g フラグがないため、置き換わるのは最初の 1 箇所だけです(ほかに 1 箇所一致しています)。
パターンが正しくありません:
パターンや文字列を変えて、一致する箇所と結果を確かめてみましょう。
正規表現を使った文字列の分割
Section titled “正規表現を使った文字列の分割”正規表現にマッチする文字列を基準に文字列を分割するには、String.splitメソッドの引数に正規表現を使用します。
/** スラッシュにマッチする正規表現 */const regexp = /\//;
const splitted = '2022/3/17'.split(regexp); // ['2022', '3', '17']