【问题标题】:Javascript split only once and ignore the restJavascript 只拆分一次,忽略其余部分
【发布时间】:2011-04-21 16:12:49
【问题描述】:

我正在解析一些用冒号分隔的键值对。我遇到的问题是,在值部分有我想忽略的冒号,但 split 函数无论如何都会捡起它们。

样本:

Name: my name
description: this string is not escaped: i hate these colons
date: a date

在单独的行上,我尝试了这个line.split(/:/, 1),但它只匹配数据的值部分。接下来我尝试了line.split(/:/, 2),但这给了我['description', 'this string is not escaped'],我需要整个字符串。

感谢您的帮助!

【问题讨论】:

    标签: javascript regex split


    【解决方案1】:
    a = line.split(/:/);
    key = a.shift();
    val = a.join(':');
    

    【讨论】:

    • 略有变化,单行:line.split(/:/).slice(1).join()
    • 单线很好,但你忘了最后的: 加入line.split(/:/).slice(1).join(':')
    【解决方案2】:

    使用贪心运算符 (?) 只拆分第一个实例。

    line.split(/: (.+)?/, 2);

    【讨论】:

    • 这不起作用。值部分中的字符串都被分解了。
    • 'description: this string is not escaped: i hate these colons'.split(/: (.+)?/, 2); 为我返回 ["description", "this string is not escaped: i hate these colons"] 它为您返回什么?
    • 我想我的例子很简单。这些字符串中有很多制表符新行和空格。这可能是它不起作用的原因。
    • 那么您将不得不采用一个不太优雅的解决方案。对不起,我不是读心术:/
    • 所以我能确认几件事吗,首先,? 不是贪婪运算符,它是非贪婪运算符,代码与/: (.+)/ 一起工作得很好其次,从玩这段代码,javascript 返回拆分然后返回任何捕获组(() 内的东西)?是对的吗?我不知道这个功能!
    【解决方案3】:

    如果您更喜欢正则表达式的替代方法,请考虑:

    var split = line.split(':');
    var key = split[0];
    var val = split.slice(1).join(":");
    

    参考:split、slice、join。

    【讨论】:

      【解决方案4】:

      稍微优雅一点:

      a = line.match(/(.*?):(.*)/);
      key = a[1];
      val = a[2];
      

      【讨论】:

        【解决方案5】:

        也许这种方法最适合这种目的:

        var a = line.match(/([^:\s]+)\s*:\s*(.*)/);
        var key = a[1];
        var val = a[2];
        

        因此,您可以在这种结构的配置/数据文件中使用制表,也不必担心名称-值分隔符 ':' 之前或之后的空格。

        或者您可以使用原始和快速字符串函数 indexOf 和 substr 以最快的方式(通过 CPU 和 RAM)实现您的目标

        for ( ... line ... ) {
            var delimPos = line.indexOf(':');
            if (delimPos <= 0) {
                continue; // Something wrong with this "line"
            }
            var key = line.substr(0, delimPos).trim();
            var val = line.substr(delimPos + 1).trim();
        
            // Do all you need with this  key: val
        }
        

        【讨论】:

          【解决方案6】:

          第一次出现时将字符串一分为二

          仅在第一个列出现时拆分具有多个列 : 的字符串
          使用 Positive Lookbehind (?&lt;=)

          const a = "Description: this: is: nice";
          const b = "Name: My Name";
          
          console.log(a.split(/(?<=^[^:]*):/)); // ["Description", " this: is: nice"]
          console.log(b.split(/(?<=^[^:]*):/)); // ["Name", " My Name"]

          它基本上从 字符串开始 ^ 消耗所有不是列 [^:] 零次或多次 * .完成后向肯定后,最终匹配列:。

          如果您还想删除列后面的一个或多个空格,
          使用/(?&lt;=^[^:]*): */

          Explanation on Regex101.com

          【讨论】:

            猜你喜欢
            • 2010-10-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多