假设我有一串像这样的单词和短语。
var a = "Apple Book \"Grand Piano\" Piano";
我有一些像这样的变量。
var b = "Piano";
var c = "Grand Piano";
如何从字符串a中删除变量b或c。目前我一直在使用javascripts替换这样的方法。
a = a.replace(b,"")
这个问题是它会从短语" Grand Piano"中删除Piano这个词。当我只想要它删除引号外的钢琴字。我一直试图使用RegExp来获得某种解决方案,但一直无法弄明白。我想我可以将字符串拆分成一个数组,然后在for循环中比较变量a / b,然后删除它们匹配的位置,然后将字符串重新组合在一起,不确定这是否是最好的方法。如果有人可以指导我朝着正确的方向前进,我将非常感激。
谢谢。
答案 0 :(得分:2)
前几天有something有点相似,你可以根据自己的情况调整它:
Piano(?!(?:[^"]*"[^"]*")*[^"]*"[^"]*$)
正则表达式基本上确保在要替换的字符串之前没有奇数引号。
您当然可以将正则表达式更改为接受变量,而不仅仅是Piano
。
答案 1 :(得分:1)
使用简单的解析器:
var words = [];
var string = "Apple Book \"Grand Piano\" Piano";
var remove_word = "Piano";
// -- tokenize input --
var i, char, looking_for_quote = false, word = "";
for (i = 0; i < string.length; i += 1) {
char = string[i];
if (char === " " && looking_for_quote === false) {
words.push(word);
word = "";
} else if (char === "\"" && looking_for_quote === false) {
looking_for_quote = true;
} else if (char === "\"" && looking_for_quote === true) {
looking_for_quote = false;
} else {
word += char;
}
}
words.push(word); // dont forget the last word
console.log(words); // gives ["Apple", "Book", "Grand Piano", "Piano"]
// -- remove words --
while (words.indexOf(remove_word) !== -1) {
words.splice(words.indexOf(remove_word), 1);
}
// reassemble output string
var out = []
for (i = 0; i < words.length; i += 1) {
word = words[i];
if (word.indexOf(" ") !== -1) {
out.push("\"" + word + "\"");
} else {
out.push(word);
}
}
console.log(out.join(" ")); // 'Apple Book "Grand Piano"'
答案 2 :(得分:0)
var a = "Apple Book \"Grand Piano\" Piano Pear";
var b = "Piano";
var c = "Grand Piano";
var regexp = new RegExp('('+b+')|('+c+')', 'g');
a = a.replace(regexp, '');
您需要同时执行所有替换,并使用与您需要排除的所有内容匹配的正则表达式。 如果需要,请确保在将它们添加到RegExp之前转义字符串。