【问题标题】:javascript split string by space, but ignore space in quotes (notice not to split by the colon too)javascript 按空格分割字符串,但忽略引号中的空格(注意不要用冒号分割)
【发布时间】:2013-04-22 02:45:46
【问题描述】:

我需要帮助在 javascript 中按空格 (" ") 拆分字符串,忽略引号表达式中的空格。

我有这个字符串:

var str = 'Time:"Last 7 Days" Time:"Last 30 Days"';

我希望我的字符串被拆分为 2:

['Time:"Last 7 Days"', 'Time:"Last 30 Days"']

但我的代码拆分为 4:

['Time:', '"Last 7 Days"', 'Time:', '"Last 30 Days"']

这是我的代码:

str.match(/(".*?"|[^"\s]+)(?=\s*|\s*$)/g);

谢谢!

【问题讨论】:

  • 虽然链接的问题是相关的,但它不是重复的:This 问题明确需要不带引号的字符串,直接相邻的双引号字符串(例如,foo:"bar none")被识别为 single 标记(并且也没有提到需要处理转义的双引号。)

标签: javascript regex split


【解决方案1】:
s = 'Time:"Last 7 Days" Time:"Last 30 Days"'
s.match(/(?:[^\s"]+|"[^"]*")+/g) 

// -> ['Time:"Last 7 Days"', 'Time:"Last 30 Days"']

解释:

(?:         # non-capturing group
  [^\s"]+   # anything that's not a space or a double-quote
  |         #   or…
  "         # opening double-quote
    [^"]*   # …followed by zero or more chacacters that are not a double-quote
  "         # …closing double-quote
)+          # each match is one or more of the things described in the group

原来,要修复你原来的表达方式,你只需要在组上添加一个+:

str.match(/(".*?"|[^"\s]+)+(?=\s*|\s*$)/g)
#                         ^ here.

【讨论】:

  • 如果您解释了正则表达式,这将是一个很好的答案。
  • 只是先把它拿出来。
  • 有没有办法通过调整正则表达式来排除双引号?即输出['Time:Last 7 Days', 'Time:Last 30 Days']
  • kch 模式的修改版本,适用于单引号或双引号:s.match(/(?:[^\s"']+|['"][^'"]*["'])+/g)
  • 如果引号被转义而不使用负前瞻(由于兼容性)怎么办?
【解决方案2】:

ES6 方案支持:

  • 除内引号外按空格分隔
  • 删除引号,但不删除反斜杠转义引号
  • 转义的引号变成引号

代码:

str.match(/\\?.|^$/g).reduce((p, c) => {
        if(c === '"'){
            p.quote ^= 1;
        }else if(!p.quote && c === ' '){
            p.a.push('');
        }else{
            p.a[p.a.length-1] += c.replace(/\\(.)/,"$1");
        }
        return  p;
    }, {a: ['']}).a

输出:

[ 'Time:Last 7 Days', 'Time:Last 30 Days' ]

【讨论】:

    【解决方案3】:

    这对我有用..

    var myString = 'foo bar "sdkgyu sdkjbh zkdjv" baz "qux quux" skduy "zsk"'; console.log(myString.split(/([^\s"]+|"[^"]*")+/g));

    输出: 数组 [""、"foo"、""、"bar"、""、""sdkgyu sdkjbh zkdjv""、""、"baz"、""、""qux quux""、""、"skduy" , " ", ""zsk"", ""]

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 2022-01-17
      • 2017-09-02
      • 2014-09-05
      • 1970-01-01
      • 2012-05-23
      相关资源
      最近更新 更多