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


238

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

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


4
您为什么不简单使用string.replace('“','')
Adarsh Kumar

69
str = str.replace(/"/g,"");
Mr_Green

11
是否要删除所有引号或边界引号?
科斯

36
stackoverflow.com/q/19155566/989121。您是否要问255个问题,每个ASCII字符一次?
乔治,

6
str = str.replace(/^"|"$/g, '');替换边界引号。Mr_Green的答案将在全球范围全部更换"这是没有好
科罗布峡谷

Answers:


387

假设:

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次或多次
  • (?="):零宽度(如未捕获)的正向超前断言。之前的匹配只有在其后跟"文字时才有效
  • ):结束捕获组,我们捕获了在开始与结束之间的所有内容 "
  • ":另一个文字,参见清单项

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

如果引号始终位于字符串的开头和结尾,则可以使用以下命令:

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

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

说明:

  • ^":匹配字符串的开头^"。如果字符串不是以a开头",则表达式在此处已经失败,并且不会替换任何内容。
  • (.+(?="$)):匹配(并捕获)所有内容,包括一次或多次使用双引号,但前提是正向提前
  • (?="$):正向前瞻与上面的非常相似,只是它指定" 必须为字符串的结尾($=== 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。容易豌豆。

温馨提示

可以在这里找到更多有关环视断言的信息。Regex
非常有用(和IMO一样有趣),乍一看可能令人费解。这里有更多详细信息,以及与此事件相关的资源链接
如果您现在还不太习惯使用正则表达式,则可以考虑使用:

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

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


1
@rid:我进行了编辑,对表达式的功能以及如何对其进行自定义进行了说明
Elias Van Ootegem 2013年

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

此正则表达式仅在引号是字符串的第一个和最后一个字符时才删除引号。F.ex:

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

63

如果保证要删除的字符串在开头和结尾都有一个引号(或任何其他单个字符),请执行以下操作:

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

slice 比正则表达式具有更少的开销。


8
为什么要下票?'“我在这里”'.slice(1,-1)->'我在这里'!
darrinm '18年

2
惊讶这已经downvoted因为它正是你所需要的,如果你处理的是RDF文字的那种“快”的操作(在N3,例如,URI是通常表示喜欢<uri>和文字一样"literal")。所以这是一个赞。;)
Mark Birbeck

2
(特别是因为原始问题说他们想删除字符串周围的引号。)
Mark Birbeck

2
这应该是被接受的答案,因为它确实可以完成所要求的内容,并且可以有效地完成它。
Pascal

38

如果您可以控制数据,并且知道双引号括在字符串内(因此不要出现在字符串内),并且该字符串是整数,则用...说:

"20151212211647278"

或类似的东西很好地删除了周围的引号

JSON.parse("20151212211647278");

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


这将在FireFox上出错,语法如下:SyntaxError:JSON.parse:JSON数据第1行第1列的意外字符
Ben Pretorius

不...在当前最新发行的FireFox上效果很好
Scott Stensland

JSON.parse(“ {123123}”); 这将打击您的答案
Abhijeet

3
JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
Systems Rebooter

1
我收到一个错误SyntaxError:JSON标记<在位置0的意外标记
Freddy Sidauruk '18

16

如果只想删除边界引号:

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

如果看起来不像,这种方法就不会碰到字符串"text in quotes"


2
使用a.charAt(x),如果你想<ECMA5支持(f.ex IE7)。
David Hellsing

8

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

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

1
请注意,这也会更改"foofoo"。一个人可能只想丢掉全部对。
科斯(Kos)

感谢您的来信,但是我认为这是预期的行为。
丹尼斯

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'

5

一个适合懒人的班轮

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

这是最合适的答案。/"/g不会工作的"My name is \"Jason\""
贾森·刘

这个答案会删除开头和结尾的所有引号,这对于" - is a quote字符串来说是不好的,所以与周围
vladkras

2

这有效...

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));


代码错误。尝试输入空字符串,或尝试'foo"或简单地进行操作foo"
Pavel P

1
var expressionWithoutQuotes = '';
for(var i =0; i<length;i++){
    if(expressionDiv.charAt(i) != '"'){
        expressionWithoutQuotes += expressionDiv.charAt(i);
    }
}

这可能对您有用。


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

0

这个简单的代码也可以使用,例如从双引号包围的字符串中删除双引号:

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

0

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

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

0

此代码非常适合文本框中的显示编号

$(this)= [您的文本框]

            var number = $(this).val();
            number = number.replace(/[',]+/g, '');
            number = number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
            $(this).val(number); // "1,234,567,890"

-2

请尝试按照正则表达式删除string中的双引号。

    $string = "I am here";
    $string =~ tr/"//d;
    print $string;
    exit();

2
他们想要一个JavaScript解决方案!
Toto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.