はじめに
- 実行環境:Google Apps Script
- 文字列
log(x)からMath.log(x)への置換
エラー内容
log(x) が1つの場合は問題なかったが、log(x) + log(y) のように複数になると一部しか置換されなかった。
js
function convertExpression(str){
str = str.replace(/log\((.+)\)/g, "Math.log($1)");
console.log(str); // Math.log(2) + log(3) ← 置換されていない
return String(eval(str));
}
console.log(convertExpression("log(2) + log(3)")); // ReferenceError: log is not defined
原因
基本的な正規表現一覧によると
+: 直前の文字が 1回以上 繰り返す場合にマッチします。最長一致。条件に合う最長の部分に一致します。
+?: 直前の文字が 1回以上 繰り返す場合にマッチします。最短一致。条件に合う最短の部分に一致します。
つまり、最初のコードでは最長一致になっていたため、1つ目の ) はスルーされ、.+ の部分に 2) + log(3 がマッチした。それが Math.log() の中に入って Math.log(2) + log(3) となったようだ。
解決
.+ の部分を .+? にすることで解決した。
js
function convertExpression(str){
str = str.replace(/log\((.+?)\)/g, "Math.log($1)");
console.log(str); // Math.log(2) + Math.log(3) ← 置換された
return String(eval(str));
}
console.log(convertExpression("log(2) + log(3)")); // 1.791759469228055
参考