我有一个文本区域,用户可以在其中编辑配置。它的格式如下:
foo = 'value'
bar = 2.1
john = false
值可以是 false、true、浮点数或字符串(无函数)。我需要正则表达式这个字符串来创建类似的东西:
{
foo: 'value',
bar: 2.1,
john: false
}
有图书馆或其他东西吗?
我有一个文本区域,用户可以在其中编辑配置。它的格式如下:
foo = 'value'
bar = 2.1
john = false
值可以是 false、true、浮点数或字符串(无函数)。我需要正则表达式这个字符串来创建类似的东西:
{
foo: 'value',
bar: 2.1,
john: false
}
有图书馆或其他东西吗?
根据您对输入数据的信任程度,您始终可以使用如下代码编写一个简单的函数(为简单起见,使用 jQuery):
var lines = $('textarea').val().split('\n');
var output = '{';
$(lines).each(function(l){
output += '\n\t' + lines[l].replace(/(\w+)\s=\s(.*)/, '$1: $2,');
});
output = output.substring(0, output.length - 1);
output += '\n}';
$('textarea').val(output);
这里的要点是,您将需要根据您想要的严格程度来调整正则表达式(即,允许空格是可选的?
,\s
或者确保值是特定格式。
我接受了这个答案,这应该是您请求的一个良好开端,并添加了一些进一步的规则来处理不同的数据类型,也许这会有所帮助:
var data ="foo = 'value'";
data +="\n" + "bar = 2.1";
data += "\n" + "john = false";
function JSONFY(data){
var regex = {
section: /^\s*\[\s*([^\]]*)\s*\]\s*$/,
param: /^\s*([\w\.\-\_]+)\s*=\s*(.*?)\s*$/,
comment: /^\s*;.*$/
};
var value = {};
var lines = data.split(/\r\n|\r|\n/);
var section = null;
function handleSection(sec) {
var isFloat = /^(?:[1-9]\d*|0)?(?:\.\d+)?$/;
if(sec.match(isFloat)) {
return parseFloat(sec);
} else if(sec=='true') {
return true;
} else if(sec=='false') {
return false;
}
return sec.replace(/^['"]/,'').replace(/['"]$/,'');
}
lines.forEach(function(line){
if(regex.comment.test(line)){
return;
}else if(regex.param.test(line)){
var match = line.match(regex.param);
if(section){
value[section][match[1]] = match[2];
}else{
value[match[1]] = handleSection(match[2]);
}
}else if(regex.section.test(line)){
var match = line.match(regex.section);
value[match[1]] = {};
section = match[1];
}else if(line.length == 0 && section){
section = null;
};
});
return value;
}
console.log(JSONFY(data));
这是要测试的小提琴。