我有一个场景,其中包含相同的文本块,但它们的正则表达式转换是不一样的。
我希望在replace中使用函数回调,而不是接近重复的替换调用。但是,似乎我不能使用1美元等等?它只打印出$ 1'从字面上看,而不是捕获组。
console.log(
('{{text1}} blah blah blah blah blah blah {{para2}}').replace(/\{\{(\w+)(\d+)\}\}/g, function(match){
if ( '$1' === "text" ) {
return '[$1/$2]';
} else {
return '[$1----$2]';
}
})
);

应该产生:
'[text/1] blah blah blah blah blah blah [para----2]'
但目前产生:
'[$1/$2] blah blah blah blah blah blah [$1----$2]'
答案 0 :(得分:2)
如果你pass a function into replace,它将把捕获的组作为完全匹配参数后的位置参数。它不会尝试解释从函数返回的字符串。
您可以通过在函数中获取这些参数来解决您的问题,并使用它们来构建您想要返回的字符串:
('{{text1}} blah blah blah blah blah blah {{para2}}').replace(/\{\{(\w+)(\d+)\}\}/g, function(match, p1, p2){
if ( p1 === "text" ) {
return '[' + p1 + '/' + p2 + ']';
} else {
return '[' + p1 + '----' + p2 + ']';
}
});
答案 1 :(得分:0)
捕获作为函数参数传递。您可以在MDN
上详细了解相关信息('{{text1}} blah blah blah blah blah blah {{para2}}').replace(/\{\{(\w+)(\d+)\}\}/g, function(match, $1, $2){
if ( $1 === "text" ) {
return '[' + $1 + '/' + $2 + ']';
} else {
return '[' + $1 + '----' + $2 + ']';
}
});
该函数将捕获作为参数function(match, $1, $2)
答案 2 :(得分:0)
('{{text1}} blah blah blah blah blah blah {{para2}}').replace(/\{\{(\w+)(\d+)\}\}/g, function(match,patt,index){
if ( patt === "text" ) {
return '['+patt+'/'+index+']';
} else {
return '['+patt+'----'+index+']';
}
});
替换方法返回索引并将函数参数中的值匹配为i。
答案 3 :(得分:0)
您需要parse the arguments或者如果您知道该号码,您可以将它们作为固定参数获取:
console.log(
('{{text1}} blah blah blah blah blah blah {{para2}}')
.replace(/\{\{(\w+)(\d+)\}\}/g,
function(match, capture1, capture2) {
if (capture1 === "text") {
return '[' + capture1 + "/" + capture2 + ']';
} else {
return '[' + capture1 + '----' + capture2 + ']';
}
})
);
答案 4 :(得分:0)
menu-level2
函数中的替换参数为字符串时, font-weight: normal;
个变量才可用。在功能的情况下,捕获的内容将通过功能中的参数来访问。因此,子匹配的数量提供了函数中的参数数量。
li
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace