JavaScriptで次のような後方参照を行うことができます。
var str = "123 $test 123";
str = str.replace(/(\$)([a-z]+)/gi, "$2");
これは(かなりばかげて)「$ test」を「test」に置き換えます。しかし、$ 2の結果の文字列を別の値を返す関数に渡したいと想像してください。これを試しましたが、文字列「test」を取得する代わりに「$ 2」を取得します。これを達成する方法はありますか?
// Instead of getting "$2" passed into somefunc, I want "test"
// (i.e. the result of the regex)
str = str.replace(/(\$)([a-z]+)/gi, somefunc("$2"));
このような:
str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); })
関数を2番目の引数としてreplace
に渡します:
str = str.replace(/(\$)([a-z]+)/gi, myReplace);
function myReplace(str, group1, group2) {
return "+" + group2 + "+";
}
mozilla.org によれば、この機能はJavascript 1.3以降に存在します。
ESNextを使用して、非常にダミーのリンクリプレースメントを使用しますが、それがどのように機能するかを示すだけです:
let text = 'Visit http://lovecats.com/new-posts/ and https://lovedogs.com/best-dogs NOW !';
text = text.replace(/(https?:\/\/[^ ]+)/g, (match, link) => {
// remove ending slash if there is one
link = link.replace(/\/?$/, '');
return `<a href="${link}" target="_blank">${link.substr(link.lastIndexOf('/') +1)}</a>`;
});
document.body.innerHTML = text;
注:以前の回答にはコードがありませんでした。修正された+例です。
受信したJSONデータのUnicodeをデコードするために、正規表現を置き換えるためにもう少し柔軟なものが必要でした。
var text = "some string with an encoded 's' in it";
text.replace(/&#(\d+);/g, function() {
return String.fromCharCode(arguments[1]);
});
// "some string with an encoded 's' in it"
後方参照の量が変化する場合、引数の数(および場所)も変化します。 MDN Web Docs は、置換引数として関数を指定するための次の構文を説明しています。
_function replacer(match[, p1[, p2[, p...]]], offset, string)
_
たとえば、次の正規表現を使用します。
_var searches = [
'test([1-3]){1,3}', // 1 backreference
'([Ss]ome) ([A-z]+) chars', // 2 backreferences
'([Mm][a@]ny) ([Mm][0o]r[3e]) ([Ww][0o]rd[5s])' // 3 backreferences
];
for (var i in searches) {
"Some string chars and many m0re w0rds in this test123".replace(
new RegExp(
searches[i]
function(...args) {
var match = args[0];
var backrefs = args.slice(1, args.length - 2);
// will be: ['Some', 'string'], ['many', 'm0re', 'w0rds'], ['123']
var offset = args[args.length - 2];
var string = args[args.length - 1];
}
)
);
}
_
ここでは 'arguments'変数を使用できません。これはArguments
型であり、Array
型ではないため、slice()
メソッドがないためです。