JavaScript-문자열 정규식 역 참조


93

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

답변:


117

이렇게 :

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

1
좋습니다. 이에 대한 자세한 정보는 어디서 찾을 수 있나요?
quano


11
멋있는. 명확히하기 위해 : $1그리고 $2여기에서 사용자가 선택한 매개 변수 이름입니다 (역 참조 기호를 모방하도록 선택됨). -다양한! -이러한 매개 변수의 수는 정규식의 캡처 그룹 수에 해당합니다.
mklement0

34

두 번째 인수로 함수를 전달합니다 replace.

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

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

mozilla.org 에 따르면이 기능은 Javascript 1.3 이후로 사용되었습니다 .


1

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;


0

참고 : 이전 답변에는 일부 코드가 없습니다. 이제 고정 + 예제입니다.


들어오는 JSON 데이터의 유니 코드를 디코딩하기 위해 정규식 교체에 대해 좀 더 유연한 것이 필요했습니다.

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

가변적 인 양의 역 참조가 있다면 인수 개수 (및 장소)도 가변적입니다. MDN 웹 문서 도구는 교체 인수로 함수를 sepcifing의 follwing을 구문에 대해 설명합니다 :

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이고 유형이 Array아니기 때문에 slice()메서드 가 없기 때문에 사용할 수 없습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.