What I want to do is str.replace(pattern, callback)
,
not simply str.replace(pa开发者_如何学运维ttern, replace_pattern)
,
is it possible to do it in javascript?
Why, yes, you can do exactly that: str.replace(pattern, function () { ... })
.
Here's some documentation: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_function_as_the_replacement
Yes
var s2 = s1.replace(/regex/, function(whole, part1, part2, ...) { ... })
The function is passed the whole matched string as the first argument. If there are any capturing groups, those are passed as subsequent arguments.
The general case have no solution with s1.replace(/regex/, function(whole, part1, part2, ...partN) { ... })
, where you need to know all parts and it is not valid g
option;
arbitrary number of itens
The example of RegExp('\{([^\}]*)\}', 'g')
can be solved by a loop... Supposing the URI-template problem, replacing each placeholder by global getData
dictionary.
const tpl = 'myEtc/{aa}/etc1/{bb}/etc2'
const getData = {"aa":"expandAA","bb":"expandBB"}
function expandTpl(getData,s0){ // s0 is the link_template_input
const r = RegExp('\{([^\}]*)\}', 'g');
let s = '';
let idx=0
for (let a; (a=r.exec(s0)) !== null;) {
s += ( s0.substring(idx, r.lastIndex-a[0].length) + getData[a[1]] )
idx = r.lastIndex
}
if ( idx<s0.length ) s += s0.substring(idx,s0.length)
return s
}
console.log( tpl )
console.log( expandTpl(getData,tpl) )
精彩评论