从这样的字符串中提取键和值的最佳方法是什么:
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 - 或者我可以测试的东西。
感谢任何帮助。
答案 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中,属性文件(它们在第一个':'或'='处断开)你可以在一个属性中有多行,方法是将'\'放在行的末尾,这样就可以了有点棘手。