我想从string中删除双引号

我想删除string周围的""

例如,如果string是: "I am here"那么我只想输出I am here

假设:

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

这应该做的伎俩…(如果你的目标是取代所有的双引号)。

这是如何工作的:

  • ['"]是一个字符类,匹配单引号和双引号,可以用"只匹配双引号"来replace。
  • + :一个或多个引号,字符,由前面的char类定义(可选)
  • g全球标志。 这告诉JS将正则expression式应用于整个string。 如果你省略这个,你只会replace一个字符。

如果你想删除给定string(即成对)的引号,事情会变得有点棘手。 你将不得不使用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 

正则expression式解释说:

  • " :文字,匹配任何文字"
  • ( :开始捕获组,括号( () )之间的任何内容都将被捕获,并可用于replace值。
  • [^"]+ :字符类,匹配所有字符,除" 1次或更多次
  • (?=") :零宽度(在未捕获的情况下)肯定的前瞻断言。以前的匹配只有在后面跟着一个"文字
  • ) :结束捕捉小组,我们已经捕获了开幕之间的所有closures"
  • " :另一个文字,比较列表项目一

replace为'$1' ,这是对第一个捕获组的返回引用,是[^" ]+ ,或者在双引号之间的每一行。引号之间的内容,从而有效地删除它们。
它所做的是some "string with" quotessome "string with" quotes"string with"replace"string with" string with 。 行情走了,工作完成。

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

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

inputremove "foo" delimiting " ,输出将保持不变,但更改inputstring为"remove "foo" delimiting quotes" ,最后remove "foo" delimiting quotes作为输出。

说明:

  • ^" :匹配string^和a "的开头。 如果string不是以"开始" ,则expression式在此处已经失败,并且没有被replace。
  • (.+(?="$)) :匹配(并捕获)所有内容,包括双引号一次或多次,前提是正向
  • (?="$) :正向预测与上面相同,只是它指定" 必须是string的末尾( $ === end)
  • "$ :匹配结束报价,但不捕获它

replace的方式与之前一样:我们将包含开头和结尾的引用(包括开头和结尾的引号)replace为其中的所有内容。
你可能已经注意到我省略了g标志(对于全局BTW),因为我们正在处理整个string,所以这个expression式只适用一次。
一个更简单的正则expression式几乎是相同的东西(正则expression式编译/应用的内部差异)是:

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

和前面的^""$匹配string开头和结尾的分隔符,并且(.+)匹配中间的所有内容,并捕获它们。 我已经试过这个正则expression式,与上面的一样(看起来断言),当然,我发现这个正好稍慢一些。 我的猜测是,只要引擎确定在string末尾没有"没有" ,周围的断言就会导致以前的expression式失败,好吧,但是如果这是你想要的,请阅读

但是,在最后一种情况下,它更安全,更快速,更易于维护,而且更好:

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

在这里,我正在检查string中的第一个和最后一个字符是否是双引号。 如果是的话,我使用substr切断那些第一个和最后一个字符。 string是零索引的,所以最后一个字符是charAt(str.length -1)substr期望2个参数,其中第一个是子串开始的偏移量,第二个是它的长度。 由于我们不想要最后一个字符,而不是我们想要的第一个字符,那么这个长度就是str.length - 2 。 易peazy。

提示

更多关于lookaround断言可以在这里find
正则expression式非常有用(和IMO有趣),起初可能有点困难。 这里有一些更多的细节,以及关于这个问题的资源的链接 。
如果你现在还不是很喜欢使用正则expression式,你可能要考虑使用:

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

如果string中有很多引号,这可能比使用正则expression式更快

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

如果它们是string的第一个和最后一个字符,则这个正则expression式只会删除引号。 F.ex:

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

如果你能控制你的数据…说:

 "20151212211647278" 

或类似这很好地删除报价

 JSON.parse("20151212211647278"); 

不是一个普遍的答案,但光滑的利基需求

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

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

这种方法不会触及string,如果它看起来不像"text in quotes"

以一种更容易expression为正则expression式的方式来重述您的问题:

获取包含在零或一个前导双引号和零尾符或一个尾随双引号之间的字符的子string。

这是这样的正则expression式:

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

打破正则expression式:

  • ^"?一个零或一个领先的双引号的贪婪匹配
  • "?$一个零或一个尾随双引号的贪婪匹配
  • 那两个是对所有其他字符(.+?)的非贪婪捕获,它将包含目标为$1

这将返回delimited "string" here

 str = "delimited "string" here" // ... str = '"delimited "string" here"' // ... str = 'delimited "string" here"' // ... and str = '"delimited "string" here' 

如果您只想从开头或结尾删除引号,请使用以下正则expression式:

 '"Hello"'.replace(/(^"|"$)/g, ''); 

一个懒惰的人的class轮

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

如果要删除string中的所有双引号,请使用

 var str = '"some "quoted" string"'; console.log( str.replace(/"/g, '') ); // some quoted string 

否则,您只想删除string周围的引号,请使用:

 var str = '"some "quoted" string"'; console.log( clean = str.replace(/^"|"$/g, '') ); // some "quoted" string 

这个简单的代码也将工作,例如删除双引号包围的双引号:

 var str = 'remove "foo" delimiting double quotes'; console.log(str.replace(/"(.+)"/g, '$1')); 

如果string在开始和结束时保证有一个引号(或任何其他单个字符),您想删除它们:

 str = str.slice(1, -1); 

slice开销比正则expression式less得多。

这是Java脚本代码…

  var string="I am here" var stringify= JSON.stringify(string); element= stringify.replace (/"/g,''); document.getElementById("demo").innerHTML = element; 

这是html代码..