代码之家  ›  专栏  ›  技术社区  ›  James

将字符串拆分为键/值的最简单方法

  •  2
  • James  · 技术社区  · 16 年前

    从这样的字符串中提取键和值的最佳方法是什么:

    var myString = 'A1234=B1234';
    

    我原来有这样的东西:

    myString.split('=');
    

    这很好,但是等号(=)可以用作字符串中的键或值,加上字符串可以有引号,如下所示:

    var myString = '"A123=1=2=3=4"="B1234"';
    

    字符串也只能有一对引号和空格:

    var myString = ' "A123=1=2=3=4" = B1234 ';
    

    我不太擅长正则表达式,但我猜这就是前进的方向?

    最后我想得到的是两个变量,key和value,在上面的例子中,key变量最终是 A123=1=2=3=4 值变量为 B1234 .

    如果没有值,例如,如果这是原始字符串:

    var myString = 'A1234';
    

    然后我希望键变量是“A1234”,值变量是空的或假的——或者我可以测试的对象。

    感谢您的帮助。

    4 回复  |  直到 16 年前
        1
  •  2
  •   paxdiablo    16 年前

    我在配置文件中所做的就是确保 分隔符可以进入键或值。

    有时候,如果你能说“不”=“允许使用字符”,那就很容易了,但我不得不在某些地方对这些字符进行编码。

    我通常用十六进制表示,如果你想要一个“=”字符,你必须输入%3d(对于“%”字符输入%25,这样你就不会认为它是十六进制起始字符)。您也可以对任何字符使用%xx,但它只是 必修的 对于这两个。

    这样,您可以检查行以确保它有一个且只有一个“=”字符,然后对键和值进行后处理,以将十六进制字符转换回实际字符。

        2
  •  4
  •   Jimmy    16 年前

    一句话也无济于事,但我建议你用一种天真的方式:

    var inQuote = false;
    for(i=0; i<str.length; i++) {
       if (str.charAt(i) == '"') {
          inQuote = !inQuote;
       }
       if (!inQuote && str.charAt(i)=='=') {
          key = str.slice(0,i);
          value = str.slice(i+1);
          break;
       }
    }
    
        3
  •  3
  •   akuhn    16 年前
    /^(\"[^"]*\"|.*?)=(\"[^"]*\"|.*?)$/
    
        4
  •  2
  •   Axeman maxelost    16 年前

    如果我们制定一个规则,所有带等号的键都需要嵌入引号中,那么这就很好地工作了(我无法想象在一个键中允许转义引号的任何好理由。)

    / ^               # Beginning of line
      \s*             # Any number of spaces
      ( " ( [^"]+) "  # A quote followed by any number of non-quotes, 
                      # and a closing quote
      | [^=]*         # OR any number of not equals signs 
        [^ =]         # and at least one character that is not a equal or a space
      )               
      \s*             # any number of spaces between the key and the operator
      =               # the assignment operator
      \s*             # Any number of spaces 
      (.*?\S)         # Then any number of any characters, stopping at the last non-space
      \s*             # Before spaces and...
      $               # The end of line. 
    

    /

    现在,在Java中,属性文件(它们在第一个‘:’或‘=’中断裂)可以通过在行的末尾放置“\\”来在属性中有多行,所以这会有点棘手。