[ @@search ]【検索 (簡易)】
[ @@replace ]【置換】

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

メモ

概要

  • 簡易な正規表現の検索 (検索結果のみ)
  • 詳細な正規表現の検索:[ @@match ]【検索 (詳細)】 (複数検索可)

外部リンク

構文

RegExp[ Symbol.search ]( string )

一致文字列位置
0 ≦ 戻り値:一致あり
-1:一致なし
string被検索文字列

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

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

const 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

const 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 ]【置換 (関数指定可)】

メモ

概要

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

外部リンク

構文

RegExp[ Symbol.replace ]( string, replaceValue )

置換後の文字列
string被置換文字列
replaceValue置換文字列 または 置換用関数 (詳細は下記参照)

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) {
    const result = RegExp.prototype[Symbol.replace].call(this, str, "(" + replaceValue + ")");
    return result;
  }
}

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

const 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

const 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;
}

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

const 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