JavaScript - referensi latar regex string


93

Anda dapat melakukan referensi ulang seperti ini di JavaScript:

var str = "123 $test 123";
str = str.replace(/(\$)([a-z]+)/gi, "$2");

Ini akan (sangat konyol) menggantikan "$ test" dengan "test". Tapi bayangkan saya ingin meneruskan string hasil $ 2 ke dalam fungsi, yang mengembalikan nilai lain. Saya mencoba melakukan ini, tetapi bukannya mendapatkan string "test", saya mendapatkan "$ 2". Apakah ada cara untuk mencapai ini?

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

Jawaban:


117

Seperti ini:

str.replace(regex, function(match, $1, $2, offset, original) { return someFunc($2); })

1
Hebat, di mana saya bisa menemukan info lebih lanjut tentang ini?
quano


11
Keren. Untuk memperjelas: $1dan $2adalah nama parameter yang dipilih pengguna di sini (dipilih untuk meniru simbol referensi latar); yang - bervariasi! - jumlah parameter ini sesuai dengan jumlah grup tangkapan di regex.
mklement0

34

Teruskan fungsi sebagai argumen kedua ke replace:

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

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

Kemampuan ini telah ada sejak Javascript 1.3, menurut mozilla.org .


1

Menggunakan ESNext, cukup menggantikan tautan tiruan tetapi hanya untuk menunjukkan cara kerjanya:

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;


0

Catatan: Jawaban sebelumnya kehilangan beberapa kode. Sekarang sudah diperbaiki + contoh.


Saya membutuhkan sesuatu yang sedikit lebih fleksibel untuk penggantian regex untuk memecahkan kode unicode dalam data JSON saya yang masuk:

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"

0

Jika Anda memiliki referensi latar dalam jumlah variabel maka jumlah argumen (dan tempat) juga variabel. The MDN Web Docs menggambarkan sintaks follwing untuk sepcifing fungsi sebagai argumen pengganti:

function replacer(match[, p1[, p2[, p...]]], offset, string)

Misalnya, ambil ekspresi reguler berikut:

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];
            }
        )
    );
}

Anda tidak dapat menggunakan variabel 'argumen' di sini karena itu adalah tipe Argumentsdan tidak ada tipe Arraysehingga tidak memiliki slice()metode.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.