假设:
var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));
这应该可以解决问题...(如果您的目标是替换 all 双引号)。
它是这样工作的:
-
['"] 是一个字符类,匹配单引号和双引号。您可以将其替换为 " 以仅匹配双引号。
-
+:一个或多个引号,字符,由前面的字符类定义(可选)
-
g:global 标志。这告诉 JS 将正则表达式应用于整个字符串。如果您忽略它,您只会替换一个字符。
如果您尝试删除给定字符串周围的引号(即成对),事情会变得有些棘手。您必须使用环视断言:
var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove foo delimiting quotes
str = 'remove only "foo" delimiting "';//note trailing " at the end
console.log(str.replace(/"([^"]+(?="))"/g, '$1'));
//logs remove only foo delimiting "<-- trailing double quote is not removed
正则表达式解释:
-
":文字,匹配任何文字 "
-
(:开始捕获组。括号 (()) 之间的内容将被捕获,并可用于替换值。
-
[^"]+:字符类,匹配所有个字符,除了" 1次或多次
-
(?="):零宽度(如未捕获)正向超前断言。前一个匹配只有在后面跟着 " 文字时才有效
-
):结束捕获组,我们已经捕获了开场闭幕之间的所有内容"
-
": 另一个字面量,cf list item one
替换为'$1',这是对第一个捕获组的反向引用,即[^" ]+,或者在双引号之间。该模式匹配引号和它们之间的内容,但仅用引号之间的内容替换它,从而有效地删除它们。
它的作用是some "string with" quotes -> 将"string with" 替换为 -> string with。行情不见了,工作完成了。
如果引号总是在字符串的开头和结尾,那么你可以使用这个:
str.replace(/^"(.+(?="$))"$/, '$1');
或者这个用于双引号和单引号:
str.replace(/^["'](.+(?=["']$))["']$/, '$1');
使用输入 remove "foo" delimiting ",输出将保持不变,但将输入字符串更改为 "remove "foo" delimiting quotes",您将得到 remove "foo" delimiting quotes 为输出。
解释:
-
^":匹配字符串 ^ 和 " 的开头。如果字符串不是以" 开头,则表达式在此处已经失败,并且没有任何内容被替换。
-
(.+(?="$)):匹配(并捕获)所有内容,包括一次或多次双引号,前提是正向预测为真
-
(?="$):正向前瞻与上面大致相同,只是它指定" 必须是字符串的结尾($ === end)
-
"$: 匹配结束引用,但不捕获它
替换的方式与以前相同:我们将匹配项(包括开始和结束引号)替换为其中的所有内容。
您可能已经注意到我省略了 g 标志(用于全局 BTW),因为因为我们正在处理整个字符串,所以这个表达式只适用一次。
一个更简单的正则表达式,几乎做同样的事情(正则表达式的编译/应用方式存在内部差异)将是:
someStr.replace(/^"(.+)"$/,'$1');
和以前一样,^" 和 "$ 匹配字符串开头和结尾的分隔引号,(.+) 匹配中间的所有内容并捕获它。我已经尝试过这个正则表达式,以及上面的一个(带有前瞻断言),诚然,令我惊讶的是,我发现这个正则表达式稍慢。我的猜测是,一旦引擎确定字符串末尾没有",环视断言就会导致前一个表达式失败。好吧,但如果这是您想要/需要的,请继续阅读:
但是,在最后一种情况下,这样做更安全、更快、更易于维护并且更好:
if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
console.log(str.substr(1,str.length -2));
}
在这里,我正在检查字符串中的第一个和最后一个字符是否是双引号。如果是,我将使用substr 切断那些第一个和最后一个字符。字符串是零索引的,所以最后一个字符是charAt(str.length -1)。 substr 需要 2 个参数,其中第一个是子字符串开始的偏移量,第二个是它的长度。由于我们不想要最后一个字符,而不是想要第一个字符,所以长度是str.length - 2。轻松愉快。
提示:
更多关于环视断言can be found here
正则表达式非常有用(而且 IMO 很有趣),起初可能有点令人困惑。 Here's some more details, and links to resources 关于此事。
如果您还不太习惯使用正则表达式,您可能需要考虑使用:
var noQuotes = someStr.split('"').join('');
如果字符串中有很多引号,这甚至可能比使用正则表达式更快