[ @@search ]【検索 (簡易)】
[ @@replace ]【置換】
RegExp.prototype[ @@search ]【検索 (簡易)】
メモ
概要
- 簡易な正規表現の検索 (検索結果のみ)
- String.search【正規表現検索 (簡易)】内から呼び出し
- カスタマイズ可能 (上記 String.search【正規表現検索 (簡易)】の処理も変更)
- 詳細な正規表現の検索:[ @@match ]【検索 (詳細)】 (複数検索可)
外部リンク
- ECMA-262 (英語)
RegExp.prototype [ @@search ] ( string ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
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'(グローバル検索) フラグを使用
- 置換用関数の指定も可
外部リンク
- ECMA-262 (英語)
RegExp.prototype [ @@replace ] ( string, replaceValue ) ES2024 (15) ES2023 (14) ES2022 (13)
構文
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