2010-03-15 3 views
73

Вы можете обратную ссылку, как это в JavaScript:JavaScript - строка регулярных выражений обратные_связи

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

Это (довольно глупо) заменить «$ тест» с «тестом». Но представьте, что я хотел бы передать полученную строку из $ 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")); 

ответ

103

Как это:

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

Высокого, где я могу найти больше информации об этом? – quano

+7

https://developer.mozilla.org/ru/Core_JavaScript_1.5_Reference/Global_Objects/String/replace – SLaks

+10

Прохладный. Чтобы уточнить: '$ 1' и' $ 2' - пользовательские имена параметров здесь (выбранные для имитации символов обратной ссылки); меняются! - число этих параметров соответствует количеству групп захвата в регулярном выражении. – mklement0

28

Pass функцию в качестве второго аргумента replace:

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

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

Эта возможность была примерно с JavaScript 1.3, в соответствии с mozilla.org.

-1

Примечание: В предыдущем ответе отсутствовал некоторый код. Теперь это исправлено + пример.


мне нужно что-то немного более гибкая для регулярных выражений заменить декодировать Юникод в моих входных данных JSON:

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"