322

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

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

4

16 回答 16

497

假设:

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 list item one

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

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

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

或者这个用于双引号和单引号:

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

使用 input remove "foo" delimiting ",输出将保持不变,但将输入字符串更改为"remove "foo" delimiting quotes",您最终将得到remove "foo" delimiting quotes输出。

解释:

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

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

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

和以前一样^""$匹配字符串开头和结尾的分隔引号,(.+)匹配中间的所有内容,并捕获它。我已经尝试过这个正则表达式,以及上面的一个(带有前瞻断言),诚然,令我惊讶的是,我发现这个正则表达式稍慢。我的猜测是,一旦引擎确定"字符串末尾没有 no ,环视断言就会导致前面的表达式失败。好吧,但是如果这是您想要/需要的,请继续阅读

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

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. 轻松愉快。

提示

更多关于环视断言的信息可以在这里找到
正则表达式非常有用(而且 IMO 很有趣),起初可能有点令人困惑。这里有更多详细信息,以及有关此事的资源的链接。
如果您还不太习惯使用正则表达式,您可能需要考虑使用:

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

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

于 2013-10-03T09:58:24.047 回答
112
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)
于 2013-10-03T10:13:34.117 回答
94

如果保证字符串在您想要删除的开头和结尾有一个引号(或任何其他单个字符):

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

slice比正则表达式的开销要少得多。

于 2017-10-27T22:12:18.233 回答
48

如果你可以控制你的数据并且你知道你的双引号包围了字符串(所以不要出现在字符串中)并且字符串是一个整数......说:

"20151212211647278"

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

JSON.parse("20151212211647278");

不是一个通用的答案,但可以满足利基需求

于 2015-12-12T21:46:30.003 回答
19

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

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

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

于 2013-10-03T10:00:43.543 回答
10

为懒惰的人准备的一个班轮

var str = '"a string"';
str = str.replace(/^"|"$/g, '');
于 2017-04-05T00:49:49.363 回答
8

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

'"Hello"'.replace(/(^"|"$)/g, '');
于 2013-10-03T10:01:23.963 回答
5

要以更容易表达为正则表达式的方式重述您的问题:

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

这是执行此操作的正则表达式:

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

分解正则表达式:

  • ^"?零或一个前导双引号的贪婪匹配
  • "?$零或一个尾随双引号的贪婪匹配
  • 这两个书挡了所有其他字符的非贪婪捕获(.+?),其中将包含目标为$1.

这将返回delimited "string" here

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'
于 2014-10-02T12:06:53.417 回答
1
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

这可能对你有用。

于 2019-05-17T11:29:29.620 回答
1

这有效...

var string1 = "'foo'";
var string2 = '"bar"';

function removeFirstAndLastQuotes(str){
  var firstChar = str.charAt(0);
  var lastChar = str[str.length -1];
  //double quotes
  if(firstChar && lastChar === String.fromCharCode(34)){
    str = str.slice(1, -1);
  }
  //single quotes
  if(firstChar && lastChar === String.fromCharCode(39)){
    str = str.slice(1, -1);
  }
  return str;
}
console.log(removeFirstAndLastQuotes(string1));
console.log(removeFirstAndLastQuotes(string2));

于 2019-04-16T03:07:30.947 回答
1

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

  var Stringstr = "\"I am here\"";
  var mystring = String(Stringstr);
  mystring = mystring.substring(1, mystring.length - 1);
  alert(mystring);
于 2019-09-09T12:43:28.117 回答
1

If you want to be old school, go with REGEX 1,$s/"//g

于 2021-03-05T23:10:38.243 回答
0

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

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

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

var str = '"some "quoted" string"';
console.log( clean = str.replace(/^"|"$/g, '') );
// some "quoted" string
于 2013-10-03T10:05:08.237 回答
0

this code is very better for show number in textbox

$(this) = [your textbox]

            var number = $(this).val();
            number = number.replace(/[',]+/g, '');
            number = number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            $(this).val(number); // "1,234,567,890"
于 2019-10-23T09:57:53.670 回答
0

这个简单的代码也可以工作,例如从用双引号括起来的字符串中删除双引号:

var str = 'remove "foo" delimiting double quotes';
console.log(str.replace(/"(.+)"/g, '$1'));
于 2015-09-11T16:02:56.433 回答
-5

Please try following regex for remove double quotes from string .

    $string = "I am here";
    $string =~ tr/"//d;
    print $string;
    exit();
于 2019-09-05T06:02:20.287 回答