我需要匹配并替换字符串:$
和$:
中未包含的所有“word”。 “word”旁边的标签中可能还有其他字符。
所以,说我有字符串
abc word hey :$ my word $:
我需要将word
替换为letter
;基本上我想获得以下字符串:
abc letter hey :$ my word $:
在JavaScript中实现这一目标的最佳方法是什么?
更多信息:
标签不会嵌套。 该字符串可能包含字符':'和'$'。在这种情况下,它们应被视为简单字符,而不是标记。
答案 0 :(得分:2)
我无法为此指定一个RegExp,所以这是一个更为迫切的方法来做到这一点 - http://jsfiddle.net/dNhLm/
var text = "abc word hey :$ my word $:";
var replace = function(text, pattern, replacement) {
var parts = [];
// This will split the string into parts. The ones that has :$ we will have to proceed further and ignore
var splitByEnd = text.split('$:');
for (i = 0, l = splitByEnd.length; i < l; i++) {
// Here we should have at most 2 parts. The left one will be outside of the :$,$: pairs and is the
// one we will apply the replacement. The right one if present will be between the :$,$: pairs and is
// not a subject of replacement.
var splitByStart = splitByEnd[i].split(':$');
splitByStart[0] = splitByStart[0].replace(pattern, replacement);
parts.push(splitByStart.join(':$'));
}
return parts.join('$:');
}
alert(replace(text, 'word', 'letter'));
答案 1 :(得分:1)
我不确定正则表达式是否适合这里的工作(解析器可能更合适),但我想一个简单的解决方案是删除标签所覆盖的位,替换所有单词,然后替换标签。有些事情(不支持嵌套标签,但应该有效):
var line = 'abc word hey :$ my word $: word :$ my word $:';
var tags = [];
var index = 0;
while (line.match(/:\$.*\$:/)) {
var start = line.indexOf(':$');
var end = line.indexOf('$:', start);
var tag = line.substring(start, end + 2);
line = line.replace(tag, '$tag' + index + '$');
tags.push(tag);
index++;
}
line = line.replace(/word/g, 'letter');
for (var i = 0; i < tags.length; i++) {
line = line.replace('$tag' + i + '$', tags[i]);
}
document.write('result ' + line)
输出:
result abc letter hey :$ my word $: letter :$ my word $:
答案 2 :(得分:0)
^(.+?)?(:\$.+?\$:)(.+?)?$
这将为您提供三个捕获组:
:?
和?:
:?
和?:
然后,您希望在第一个和第三个捕获组上执行常规字符串替换,将word
替换为letter
。
第一组和第三组是可选的,:?word?: another word
也会匹配。
var regex = /^(.+?)?(:\$.+?\$:)(.+?)?$/i;
regex.exec('abc word hey :$ my word $:');
alert(RegExp.$1.replace("word", "letter") + RegExp.$2 + RegExp.$3.replace("word", "letter"));
答案 3 :(得分:0)
我能想到的是没有简单的正则表达式。
您可以寻找多个正则表达式
var s1 = 'abc word hey :$ my word $: def word :$ another word $: word ghi :$ a third word $: jkl word';
var s2;
// word at the beginning
s2 = s1.replace(/^([^:$]*)word/, '$1letter');
// word at the end
s2 = s1.replace(/word([^:$]*)$/, 'letter$1');
// and word in between
s2 = s1.replace(/(:[^$]*)word([^$]*:)/g, '$1letter$2');
console.log(s2);
请参阅JSFiddle