我想从字符串中删除双引号

2022-08-29 23:50:12

我想删除字符串周围的。""

例如,如果字符串是:,那么我只想输出。"I am here"I am here


答案 1

若:

var someStr = 'He said "Hello, my name is Foo"';
console.log(someStr.replace(/['"]+/g, ''));

这应该可以解决问题...(如果您的目标是替换所有双引号)。

以下是它的工作原理:

  • ['"]是一个字符类,匹配单引号和双引号。您可以将其替换为仅匹配双引号。"
  • +:一个或多个引号,字符,由前面的字符类定义(可选)
  • g全局标志。这告诉 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 列表项一

替换是 ,这是对第一个捕获的组的反向引用,在双引号之间是 或 everyting。该模式同时匹配引号和它们之间的内容,但仅将其替换为引号之间的内容,从而有效地删除它们。
它的作用是 -> 替换为 -> 。报价消失了,工作完成了。'$1'[^" ]+some "string with" quotes"string with"string with

如果引号总是在字符串的开头和结尾,那么你可以使用这个:

str.replace(/^"(.+(?="$))"$/, '$1');

或者对于双引号和单引号:

str.replace(/^["'](.+(?=["']$))["']$/, '$1');

使用输入删除“foo”分隔符“,输出将保持不变,但将输入字符串更改为”删除“foo”分隔引号“,你最终会得到输出。remove "foo" delimiting quotes

解释:

  • ^":匹配字符串的开头和 .如果字符串不以 a 开头,则表达式在此处已失败,并且不会替换任何内容。^""
  • (.+(?="$)):匹配(并捕获)所有内容,包括一次或多次双引号,前提是正面观察结果为真
  • (?="$):正前方与上面大致相同,只是它指定必须为字符串的结尾( === end)"$
  • "$:匹配该结束引号,但不捕获它

替换以与以前相同的方式完成:我们将匹配(包括开始和结束引号)替换为其中的所有内容。
您可能已经注意到我省略了标志(对于全局BTW),因为由于我们正在处理整个字符串,因此此表达式仅应用一次。
一个更简单的正则表达式,几乎可以做同样的事情(正则表达式的编译/应用方式存在内部差异)将是:g

someStr.replace(/^"(.+)"$/,'$1');

与以前一样,匹配字符串开头和结尾处的分隔引号,匹配两者之间的所有内容,并捕获它。我已经尝试了这个正则表达式,与上面的正则表达式(带有前瞻断言)一起,并且,不可否认,我的surprize发现这个正则表达式稍微慢一些。我的猜测是,一旦引擎确定字符串末尾没有,Lookround断言就会导致前面的表达式失败。嗯,但是如果这是你想要/需要的,请继续阅读^""$(.+)"

但是,在最后一种情况下,这样做更安全,更快,更易于维护,并且更好:

if (str.charAt(0) === '"' && str.charAt(str.length -1) === '"')
{
    console.log(str.substr(1,str.length -2));
}

在这里,我正在检查字符串中的第一个和最后一个字符是否是双引号。如果是这样,我用它来切断那些第一个和最后一个字符。字符串的索引为零,因此最后一个字符是 . 期望 2 个参数,其中第一个是子字符串开始的偏移量,第二个是其长度。由于我们不需要最后一个字符,就像我们想要第一个字符一样,因此该长度为 。容易啃咬。substrcharAt(str.length -1)substrstr.length - 2

温馨提示

更多关于查看断言可以在这里
找到 正则表达式非常有用(和IMO的乐趣),一开始可能会有点尴尬。以下是一些更多详细信息,以及有关此事的资源链接
如果您还不太喜欢使用正则表达式,则可能需要考虑使用:

var noQuotes = someStr.split('"').join('');

如果字符串中有很多引号,这甚至可能比使用正则表达式更快


答案 2
str = str.replace(/^"(.*)"$/, '$1');

此正则表达式将仅删除引号,如果它们是字符串的第一个和最后一个字符。例如:

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)