我想从String中删除双引号

ank*_*kur 220 javascript regex

我想删除""一个字符串.

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

Eli*_*gem 361

假设:

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

这应该是诀窍......(如果你的目标是替换所有双引号).

以下是它的工作原理:

  • ['"]是一个字符类,匹配单引号和双引号.您可以将其替换"为仅匹配双引号.
  • +:一个或多个引号,字符,由前面的char类定义(可选)
  • g:全球旗帜.这告诉JS将正则表达式应用于整个字符串.如果省略这个,你只会替换一个char.

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

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
Run Code Online (Sandbox Code Playgroud)

正则表达式解释说:

  • ":literal,匹配任何文字 "
  • (:开始捕获组.()将捕获括号()之间的任何内容,并且可以在替换值中使用.
  • [^"]+:字符类,匹配所有字符,除了"1次或更多次
  • (?="):零宽度(如未捕获)正向前瞻断言.上一个匹配仅在其后跟一个"文字时才有效
  • ):结束捕获组,我们已经捕获了关闭之间的所有内容 "
  • ":另一个文字,cf列表项目一

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

如果引号始终位于字符串的开头和结尾,那么您可以使用:

str.replace(/^"(.+(?="$))"$/, '$1');
Run Code Online (Sandbox Code Playgroud)

使用输入时remove "foo" delimiting ",输出将保持不变,但将输入字符串更改为"remove "foo" delimiting quotes",并且最终将remove "foo" delimiting quotes作为输出.

说明:

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

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

someStr.replace(/^"(.+)"$/,'$1');
Run Code Online (Sandbox Code Playgroud)

和之前一样^","$匹配字符串开头和结尾的分隔引号,并(.+)匹配其间的所有内容,并捕获它.我已经尝试过这个正则表达式,与上面的一个(带有前瞻性断言)并且,不可否认,我的惊喜发现这个有点慢.我的猜测是,当引擎确定"字符串末尾没有时,外观断言会导致前一个表达式失败.好吧,但如果这是你想要/需要的,请继续阅读:

但是,在最后一种情况下,它更安全,更快速,更易于维护,并且更好地执行此操作:

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

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

小贴士:

关于环绕声断言的更多信息可以在这里找到正则
表达式是非常有用的(和IMO乐趣),起初可能有点令人费解.这里有一些更多的细节,以及有关此事的资源的链接.
如果您对使用正则表达式感到不舒服,可能需要考虑使用:

var noQuotes = someStr.split('"').join('');
Run Code Online (Sandbox Code Playgroud)

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

  • @rid:我编辑了一些关于表达式的作用以及如何自定义它的内容 (2认同)

Dav*_*ing 73

str = str.replace(/^"(.*)"$/, '$1');
Run Code Online (Sandbox Code Playgroud)

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

"I am here"  => I am here (replaced)
I "am" here  => I "am" here (untouched)
I am here"   => I am here" (untouched)
Run Code Online (Sandbox Code Playgroud)


dar*_*inm 45

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

str = str.slice(1, -1);
Run Code Online (Sandbox Code Playgroud)

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

  • 为什么选票呢?'"我在这里"'.切片(1,-1) - >'我在这里'! (7认同)
  • 令人惊讶的是,这已经被否决了,因为如果您正在处理 RDF 文字,这正是您需要的那种“快速”操作(例如,在 N3 中,URI 通常表示为 `&lt;uri&gt;` 和文字如 `"literal"` )。所以这是一个赞成票。;) (3认同)
  • (特别是因为最初的问题是说他们想删除字符串中的引号。) (2认同)
  • 这应该是被接受的答案,因为它确实可以完成所要求的功能,并且可以高效地完成它。 (2认同)

Sco*_*and 33

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

"20151212211647278"
Run Code Online (Sandbox Code Playgroud)

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

JSON.parse("20151212211647278");
Run Code Online (Sandbox Code Playgroud)

对于利基需求而言,这不是一个普遍的答案

  • `JSON.parse("20151212211647278dfvs");```SyntaxError:JSON位置17的意外标记d (3认同)
  • 这个答案怎么有19个投票? (3认同)
  • 我收到一个错误 SyntaxError: Unexpected token &lt; in JSON at position 0 (2认同)

Kos*_*Kos 14

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

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

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

  • 如果你想要<ECMA5支持(f.ex IE7),请使用`a.charAt(x)`. (2认同)

Den*_*nis 8

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

'"Hello"'.replace(/(^"|"$)/g, '');
Run Code Online (Sandbox Code Playgroud)


Mog*_*dad 5

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

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

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

  var regexp = /^"?(.+?)"?$/;
  var newStr = str.replace(/^"?(.+?)"?$/,'$1');
Run Code Online (Sandbox Code Playgroud)

打破正则表达式:

  • ^"? 零或一个双引号的贪婪匹配
  • "?$ 零或一个尾随双引号的贪婪匹配
  • 那两个人对所有其他角色进行了非贪婪的捕获(.+?),其中包含了目标$1.

这将返回delimited "string" here:

str = "delimited "string" here"  // ...
str = '"delimited "string" here"' // ...
str = 'delimited "string" here"' // ... and
str = '"delimited "string" here'
Run Code Online (Sandbox Code Playgroud)


Kol*_*yon 5

一个适合懒人的班轮

var str = '"a string"';
str = str.replace(/^"|"$/g, '');
Run Code Online (Sandbox Code Playgroud)