[ @@search ] 【検索 (簡易)】メソッド
[ @@replace ]【置換】メソッド

RegExp.prototype.[ @@search ] 【検索 (簡易)】

メモ

  • 簡易な正規表現の検索 (検索結果のみ)
  • 詳細な正規表現の検索:[ @@match ]【検索 (詳細)】 (複数検索可)
  • String.search【正規表現検索 (簡易)】内から呼び出し
  • カスタマイズ可能 (上記 String.search【正規表現検索 (簡易)】の処理も変更)

構文

[ @@search ] ( string )

  • string:被検索文字列

  • 一致文字列位置
    戻り値説明
    0 ≦ 戻り値一致あり
    -1一致なし

/**
 * search 用カスタマイズクラス
 * @extends RegExp
 */
class SearchRegExp extends RegExp {
  /**
   * コンストラクタ (正規表現を行末に変更)
   * @param {string} str 正規表現
   */
  constructor(str) {
    super(str + "$");
  }
  // [@@search]メソッドをカスタマイズ (出力結果を編集)
  [Symbol.search](str) {
    var result = RegExp.prototype[Symbol.search].call(this, str);
    return str + ":" + result;
  }
}

var strReg = "[0-9]+";
var str = "090-1234-5678";
var result;

var searchEx = new RegExp(strReg);

// オリジナル RegExp[Symbol.search]()
result = searchEx[Symbol.search](str);
console.log(result);
// 出力:0

// オリジナル String.prototype.search()
result = str.search(searchEx);
console.log(result);
// 出力:0

var mySearch = new SearchRegExp(strReg);

// カスタマイズ RegExp[Symbol.search]()
result = mySearch[Symbol.search](str);
console.log(result);
// 出力:090-1234-5678:9

// カスタマイズ String.prototype.search()
result = str.search(mySearch);
console.log(result);
// 出力:090-1234-5678:9

RegExp.prototype.[ @@replace ]【置換 (関数指定可)】

メモ

  • 文字列の置換
  • 全て置換する場合は、正規表現の'g'(グローバル検索) フラグを使用
  • 置換用関数の指定も可
  • String.replace【置換 (正規表現可・関数指定可)】内から呼び出し
  • カスタマイズ可能 (上記 String.replace【置換 (正規表現可・関数指定可)】の処理も変更)

構文

[ Symbol.replace ] ( string, replaceValue )

  • string:被置換文字列
  • replaceValue (文字列):置換文字列 (以下の置換パターンも利用可能)
    置換パターン説明
    $$'$' 文字
    $&マッチした部分文字列
    $`マッチした部分文字列の直前の文字列
    $'マッチした部分文字列の直後の文字列
    $n括弧で囲まれた n (1~9)番目のマッチ部分
    $nn括弧で囲まれた nn (01~99)番目のマッチ部分
  • replaceValue (関数):置換用関数 ('g'【グローバル検索】フラグ使用の場合、一致回数分呼び出し)
    引数名 (例)説明
    matchマッチした部分文字列
    p1~括弧で囲まれたマッチ部分 (マッチ数分)
    offsetマッチ部分のオフセット
    string置換元の全体文字列
    戻り値型説明
    文字列置換後の文字列

  • 置換後の文字列

/**
 * replace 用カスタマイズクラス
 * @extends RegExp
 */
class ReplaceRegExp extends RegExp {
  /**
   * コンストラクタ (正規表現を行末に変更)
   * @param {string} str 正規表現
   */
  constructor(str) {
    super(str + "$");
  }
  // [@@replace]メソッドをカスタマイズ (出力結果を編集)
  [Symbol.replace](str, replaceValue) {
    result = RegExp.prototype[Symbol.replace].call(this, str, "(" + replaceValue + ")");
    return result;
  }
}

var strReg = "[0-9]+";
var str = "090-1234-5678";
var strNew = "####";
var result;

var replaceEx = new RegExp(strReg);

// オリジナル RegExp[Symbol.replace]()
result = replaceEx[Symbol.replace](str, strNew);
console.log(result);
// 出力:####-1234-5678

// オリジナル String.prototype.replace()
result = str.replace(replaceEx, strNew);
console.log(result);
// 出力:####-1234-5678

var myReplace = new ReplaceRegExp(strReg);

// カスタマイズ RegExp[Symbol.replace]()
result = myReplace[Symbol.replace](str, strNew);
console.log(result);
// 出力:090-1234-(####)

// カスタマイズ String.prototype.replace()
result = str.replace(myReplace, strNew);
console.log(result);
// 出力:090-1234-(####)
/**
 * 置換用関数
 * @param  {string} match  マッチした部分文字列
 * @param  {string} p1     マッチ部分1
 * @param  {string} p2     マッチ部分2
 * @param  {number} offset マッチ部分のオフセット
 * @param  {string} str    置換前の全体文字列
 * @return {string}        置換後の文字列
 */
function funcReplace(match, p1, p2, offset, str) {
  console.log("funcReplace", match, p1, p2, offset, str);
  strReplace = "(p1)" + p1 + "-(p2)" + p2;
  return strReplace;
}

var strReg = "([0-9]+)-([A-Z]+)";
var str = "123-ABC-456-DEF-789-GHI";
var result;

var replaceEx = new RegExp(strReg, "g");
result = replaceEx[Symbol.replace](str, funcReplace);
// 出力:funcReplace 123-ABC 123 ABC 0 123-ABC-456-DEF-789-GHI
// 出力:funcReplace 456-DEF 456 DEF 8 123-ABC-456-DEF-789-GHI
// 出力:funcReplace 789-GHI 789 GHI 16 123-ABC-456-DEF-789-GHI
console.log(result);
// 出力:(p1)123-(p2)ABC-(p1)456-(p2)DEF-(p1)789-(p2)GHI