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

时间:2008-12-11 01:18:59

标签: javascript regex

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

var myString = 'A1234=B1234';

我最初有这样的事情:

myString.split('=');

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

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

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

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

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

我想要最终得到的是两个变量,键和值,在上面的例子中,键变量最终将是 A123 = 1 = 2 = 3 = 4 和值变量将 B1234

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

var myString = 'A1234';

然后我希望键变量为'A1234',值变量为null或false - 或者我可以测试的东西。

感谢任何帮助。

4 个答案:

答案 0 :(得分:4)

无法帮助单线,但我会建议天真的方式:

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;
   }
}

答案 1 :(得分:3)

/^(\"[^"]*\"|.*?)=(\"[^"]*\"|.*?)$/

答案 2 :(得分:2)

我在配置文件中倾向于做的是确保分隔符可以进入键或值的 no 可能性。

如果你只能说“不'='字符允许”,那么有时这很容易,但我不得不求助于在某些地方对这些字符进行编码。

我通常将它们组合起来,这样如果你想要一个'='字符,你就必须输入%3d(和%25代表'%'字符,所以你不认为它是一个十六进制的字符) 。你也可以将%xx用于任何角色,但这两个角色只有必需

这样你可以检查一行以确保它只有一个'='字符,然后对键和值进行后处理,将十六进制字符变回真实字符。

答案 3 :(得分:2)

如果我们制定一个规则,所有具有相同符号的键都需要嵌入引号内,那么这种方法效果很好(我无法想象在密钥中使用转义引号的任何正当理由。)

/ ^               # 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中,属性文件(它们在第一个':'或'='处断开)你可以在一个属性中有多行,方法是将'\'放在行的末尾,这样就可以了有点棘手。