99

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"));
4

5 に答える 5

123

このような:

str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); })
于 2010-03-15T14:51:48.907 に答える
37

replace2番目の引数として関数を:に渡します。

str = str.replace(/(\$)([a-z]+)/gi, myReplace);

function myReplace(str, group1, group2) {
    return "+" + group2 + "+";
}

mozilla.orgによると、この機能はJavascript1.3から使用されています。

于 2010-03-15T14:52:29.103 に答える
2

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;

于 2018-06-08T18:54:24.153 に答える
0

注:前の回答にはいくつかのコードがありませんでした。+例が修正されました。


着信JSONデータのUnicodeをデコードするために、正規表現を置き換えるためにもう少し柔軟なものが必要でした。

var text = "some string with an encoded '&#115;' in it";

text.replace(/&#(\d+);/g, function() {
  return String.fromCharCode(arguments[1]);
});

// "some string with an encoded 's' in it"
于 2017-02-24T12:58:21.603 に答える
0

可変量の後方参照がある場合は、引数の数(および場所)も可変です。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()メソッドがないためです。

于 2018-07-05T14:45:21.153 に答える