3

假设我有一串这样的单词和短语。

var a = "Apple Book \"Grand Piano\" Piano";

我有一些这样的变量。

var b = "Piano";
var c = "Grand Piano";

如何从字符串 a 中删除变量 b 或 c。目前我一直在使用像这样的javascripts替换方法。

a = a.replace(b,"")

这样做的问题是,当我只希望它删除引号之外的单词 Piano 时,它会从短语“Grand Piano”中删除单词 Piano。我一直在尝试使用 RegExp 来获得某种解决方案,但一直无法弄清楚。我在想我可以将字符串拆分为一个数组,然后在 for 循环中比较变量 a/b,然后删除它们匹配的位置,然后将字符串重新组合在一起,不确定这是否是最好的方法。如果有人能引导我朝着正确的方向前进,我将不胜感激。

谢谢你。

4

3 回答 3

2

几天前有一些类似的东西,您可以根据您的情况进行调整:

Piano(?!(?:[^"]*"[^"]*")*[^"]*"[^"]*$)

JSFiddle 演示

正则表达式基本上确保在要替换的字符串之前没有奇数个引号。

您当然可以更改正则表达式以接受变量,而不仅仅是Piano.

于 2013-08-29T15:38:52.527 回答
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"'
于 2013-08-29T15:39:01.220 回答
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 之前对其进行转义。

于 2013-08-29T15:37:43.510 回答