我想删除字符串周围的“”。

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


当前回答

如果你可以控制你的数据,你知道你的双引号包围字符串(所以不出现在字符串中),字符串是一个整数…用:

"20151212211647278"

或者类似的,这很好地删除了周围的引号

JSON.parse("20151212211647278");

这不是一个通用的答案,但巧妙地满足了利基需求

其他回答

假设:

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

这应该能奏效……(如果您的目标是替换所有双引号)。

下面是它的工作原理:

['"]是一个字符类,同时匹配单引号和双引号。您可以将此替换为“to only match双引号”。 +:一个或多个引号,字符,由前面的char-class定义(可选) G:全球标志。这告诉JS将正则表达式应用于整个字符串。如果省略这个,您将只替换一个字符。

如果您试图删除给定字符串周围的引号(即成对),事情会变得有点棘手。你必须使用lookaround断言:

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

正则表达式解释道:

": literal,匹配任何literal " (:开始捕获组。括号(())之间的任何内容都将被捕获,并可用于替换值。 [^"]+:字符类,匹配所有字符,“1次或更多”除外 (?="):零宽度(如未捕获)正向前视断言。前一个匹配只有在后面跟着一个“literal”时才有效 ):结束捕捉组,我们捕捉了从开始到结束之间的一切。 :另一个文字,cf列表项1

替换为'$1',这是对第一个捕获的组的反向引用,是[^"]+,或双引号之间的所有内容。该模式匹配引号和引号之间的内容,但只替换引号之间的内容,从而有效地删除了它们。 它所做的是一些“字符串与”引号->替换“字符串与”与->字符串与。报价没了,工作完成了。

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

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

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

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

当输入remove "foo" delimiting "时,输出将保持不变,但将输入字符串更改为"remove "foo" delimiting quotes",最后将输出remove "foo" delimiting quotes。

解释:

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

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

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

As before ^" and "$ match the delimiting quotes at the start and end of a string, and the (.+) matches everything in between, and captures it. I've tried this regex, along side the one above (with lookahead assertion) and, admittedly, to my surprize found this one to be slightly slower. My guess would be that the lookaround assertion causes the previous expression to fail as soon as the engine determines there is no " at the end of the string. Ah well, but if this is what you want/need, please do read on:

然而,在最后一种情况下,这样做更安全、更快、更可维护,而且更好:

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

在这里,我检查字符串中的第一个和最后一个字符是否为双引号。如果是,我使用substr来截断第一个和最后一个字符。字符串是零索引的,所以最后一个字符是charAt(str。1)长度。Substr需要2个参数,其中第一个是子字符串开始的偏移量,第二个是它的长度。因为我们不想要最后一个字符,就像我们想要第一个字符一样,这个长度是str.length - 2。Easy-peazy。

小贴士:

更多关于巡视断言的信息可以在这里找到 正则表达式非常有用(在我看来也很有趣),一开始可能会有点困惑。这里有更多的细节,以及相关资源的链接。 如果你还不太习惯使用正则表达式,你可能会考虑使用:

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

如果字符串中有很多引号,这甚至可能比使用regex更快

如果你只想删除边界引号:

function stripquotes(a) {
    if (a.charAt(0) === '"' && a.charAt(a.length-1) === '"') {
        return a.substr(1, a.length-2);
    }
    return a;
}

如果字符串看起来不像“带引号的文本”,这种方法不会触及字符串。

这是为懒人设计的一款简单的工具

var str = '"a string"';
str = str.replace(/^"|"$/g, '');

如果你可以控制你的数据,你知道你的双引号包围字符串(所以不出现在字符串中),字符串是一个整数…用:

"20151212211647278"

或者类似的,这很好地删除了周围的引号

JSON.parse("20151212211647278");

这不是一个通用的答案,但巧妙地满足了利基需求

如果您试图删除双引号,请尝试以下操作

  var Stringstr = "\"I am here\"";
  var mystring = String(Stringstr);
  mystring = mystring.substring(1, mystring.length - 1);
  alert(mystring);