【问题标题】:I want to remove double quotes from a String我想从字符串中删除双引号
【发布时间】:2013-10-09 23:19:23
【问题描述】:

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

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

【问题讨论】:

  • 你为什么不简单地使用 string.replace('"','')
  • str = str.replace(/"/g,"");
  • 要删除所有引号还是边界引号?
  • @Mr_Green 的选项有效。第一个仅删除第一个外部引号。
  • str = str.replace(/^"|"$/g, ''); 替换边界引号。 Mr_Green 的回答将全局替换 ALL ",这是不好的

标签: javascript regex


【解决方案1】:

假设:

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

这应该可以解决问题...(如果您的目标是替换 all 双引号)。

它是这样工作的:

  • ['"] 是一个字符类,匹配单引号和双引号。您可以将其替换为 " 以仅匹配双引号。
  • +:一个或多个引号,字符,由前面的字符类定义(可选)
  • gglobal 标志。这告诉 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',这是对第一个捕获组的反向引用,即[^" ]+,或者在双引号之间。该模式匹配引号和它们之间的内容,但仅用引号之间的内容替换它,从而有效地删除它们。
它的作用是some "string with" quotes -> 将"string with" 替换为 -> string with。行情不见了,工作完成了。

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

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

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

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

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

解释:

  • ^":匹配字符串 ^" 的开头。如果字符串不是以" 开头,则表达式在此处已经失败,并且没有任何内容被替换。
  • (.+(?="$)):匹配(并捕获)所有内容,包括一次或多次双引号,前提是正向预测为真
  • (?="$):正向前瞻与上面大致相同,只是它指定" 必须是字符串的结尾($ === 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。轻松愉快。

提示

更多关于环视断言can be found here
正则表达式非常有用(而且 IMO 很有趣),起初可能有点令人困惑。 Here's some more details, and links to resources 关于此事。
如果您还不太习惯使用正则表达式,您可能需要考虑使用:

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

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

【讨论】:

  • @rid:我编辑,解释了表达式的作用,以及如何自定义它
  • 我认为someStr.replace(/^"(.+)"$/,'$1'); 应该使用.* 而不是.+。测试用例'""'。比如'""'.replace(/^"(.+)"$/,'$1')返回"",但是'""'.replace(/^"(.*)"$/,'$1')返回``
【解决方案2】:
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)

【讨论】:

    【解决方案3】:

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

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

    slice 的开销远低于正则表达式。

    【讨论】:

    • 为什么投反对票? '"我在这里"'.slice(1, -1) -> '我在这里'!
    • 很惊讶这被否决了,因为如果您正在处理 RDF 文字,它正是您需要的那种“快速”操作(例如,在 N3 中,URI 通常表示为 &lt;uri&gt; 和文字像"literal")。所以这是一个赞成票。 ;)
    • (特别是因为原始问题说他们想删除 周围 字符串的引号。)
    • 这应该是公认的答案,因为它完全按照要求执行,而且执行效率很高。
    • 它删除了“”,但也删除了两端的字符
    【解决方案4】:

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

    "20151212211647278"
    

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

    JSON.parse("20151212211647278");
    

    不是一个通用的答案,但很适合小众需求

    【讨论】:

    • 这将在 FireFox 上出错:SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
    • no ... 在当前最新版本的 FireFox 上运行良好
    • JSON.parse("{123123}");这会吹掉你的答案
    • JSON.parse("20151212211647278dfvs"); SyntaxError: Unexpected token d in JSON at position 17
    • 我收到一个错误 SyntaxError: Unexpected token
    【解决方案5】:

    如果只想去掉边界引号:

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

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

    【讨论】:

    • 如果你想要 a.charAt(x)。
    【解决方案6】:

    为懒惰的人准备的单线

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

    【讨论】:

    • 这是最合适的答案。 /"/g 不适用于 "My name is \"Jason\""
    • 这个答案去掉了开头和结尾的every引号,在" - is a quote字符串的情况下不好,所以和around
    【解决方案7】:

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

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

    【讨论】:

    • 请注意,这也会改变"foofoo"。人们可能只想丢弃整对。
    • 感谢您的注意,不过我认为这是预期的行为。
    【解决方案8】:

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

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

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

      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'
    

    【讨论】:

      【解决方案9】:

      这行得通...

      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"
      • if(firstChar &amp;&amp; lastChar === String.fromCharCode(34)) 错了,不能这样一次性比较两个字符串。
      【解决方案10】:
      var expressionWithoutQuotes = '';
      for(var i =0; i<length;i++){
          if(expressionDiv.charAt(i) != '"'){
              expressionWithoutQuotes += expressionDiv.charAt(i);
          }
      }
      

      这可能对你有用。

      【讨论】:

        【解决方案11】:

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

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

        【讨论】:

          【解决方案12】:

          如果您想成为老派,请使用 REGEX 1,$s/"//g

          【讨论】:

          • 问题是关于 JavaScript 的。
          【解决方案13】:

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

          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
          

          【讨论】:

            【解决方案14】:

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

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

            【讨论】:

              【解决方案15】:

              这段代码更适合在文本框中显示数字

              $(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"
              

              【讨论】:

                【解决方案16】:

                请尝试按照正则表达式从字符串中删除双引号。

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

                【讨论】:

                • 他们想要一个 javascript 解决方案!
                猜你喜欢
                • 2012-09-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-07-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-02-26
                相关资源
                最近更新 更多