X hashtag: #esspec
便利ツール
時事ネタ
フロカン福岡
フロカン関西
JSConf
フロカン東京
自己紹介 (近況報告)
syumai syumai.icon
TSを書いて暮らしてます
フロカン北海道で話してきました
iwatsurut
とくに、イベントもなく過ごしています。
igrep(山本悠滋)
neovideが便利なので関連する設定をごちゃごちゃいじってハマるのが最近の寝不足要因
maru。(まる)
主にTSで仕事してます。React, Node。
青森でワーケーションしてましたが青森よかったです(青森市がやってる体験モニター)
同時編集JavaScript Playground
前半
後半
前回のあらすじ
今回のメモ
英語
For the purposes of this abstract operation, a decimal digit is a code unit in the inclusive interval from 0x0030 (DIGIT ZERO) to 0x0039 (DIGIT NINE).
「For the purposes of...」は、仕様書などの技術文書で「本節の目的において」や「この操作において」のように、その定義の適用範囲を限定する際によく使われる表現
code:js
// ===== Code =====
console.log("abcdeabcde".replace(/bc/g, "$`")); console.log("abcdeabcde".replace(/bc/g, "$&")); console.log("abcdeabcde".replace(/bc/g, "$'")); // ===== Output =====
code:js
// ===== Code =====
// 通常のパターン
console.log("abcdeabcde".replace(/b(.)(.)/g, "$2$1")); console.log("abcdeabcde".replace(/b(.)(.)/g, "$02$01")); // vi. 2桁かつ、キャプチャ数をindexが超える時
console.log("abcdeabcde".replace(/b(.)(.)/g, "$25")); console.log("abcdeabcde".replace(/b(.)(.)/g, "$256")); // ix. Else のパターン
console.log("abcdeabcde".replace(/b(.)(.)/g, "$3")); console.log("abcdeabcde".replace(/b(.)(.)/g, "$0")); try {
console.log("abcdeabcde".replace(/b(.)(.)/g, "$$$$$"));
} catch (e) {
console.error(e);
}
{
let src = "b";
src += "(.)".repeat(100);
const regexp = new RegExp(src);
const target = "abcdef".repeat(50);
let replacement = "";
for (let i = 0; i < 100; i++) {
replacement += [$${i + 1}];
}
console.log(
JSON.stringify({
src, target, replacement
},
null,
2),
);
console.log(target.replace(regexp, replacement));
}
// ===== Output =====
a$$$ea$$$e
{
"src": "b(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)",
"target": "abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdef",
}
code:js
// ===== Code =====
// 通常のパターン
console.log("abcdeabcde".replace(/b(.)(.)/g, "$2$1")); console.log("abcdeabcde".replace(/b(.)(.)/g, "$02$01")); console.log("abcdeabcde".replace(/(?<name>b.)/g, "$<name>")); // 日本語識別子
console.log("abcdeabcde".replace(/(?<あいうえお>b.)/g, "$<あいうえお>")); // 数字から始まる識別子
// SyntaxError: Invalid regular expression: /(?<0abc>b.)/g: Invalid capture group name
// console.log("abcdeabcde".replace(/(?<0abc>b.)/g, "$<0abc>")); console.log("2026-06-09".replace(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/, "$<day>/$<month>/$<year>"))
// => "09/06/2026"
{
try {
eval(console.log("abcdeabcde".replace(/(?<0abc>b.)/g, "[$<0abc>]")););
} catch(err) {
console.error(err);
}
}
// ===== Output =====
09/06/2026
SyntaxError: Invalid regular expression: /(?<0abc>b.)/g: Invalid capture group name
code:js
// ===== Code =====
console.log("abcdeabcde".search(/bc/));
console.log("abcdeabcde".search(/bd/));
const mySearcher = {
console.log(JSON.stringify({ thisValue }, null, 2));
return "xyz";
}
}
console.log("abcdeabcde".search(mySearcher));
{
const str = "#foo#";
const regex = /foo/y;
regex.lastIndex = 1;
console.log(regex.test(str)); // true
regex.lastIndex = 5;
console.log(regex.test(str)); // false (sticky フラグがあるので lastIndex から始める)
regex.lastIndex; // 0 (照合に失敗した後はリセット)
const regex1 = /bc/y;
regex1.lastIndex = 5;
console.log("abcdeabcde".search(regex1));
}
// ===== Output =====
1
-1
{
"thisValue": "abcdeabcde"
}
xyz
true
false
-1