0

我有一个文本区域,用户可以在其中编辑配置。它的格式如下:

foo = 'value'
bar = 2.1
john = false

值可以是 false、true、浮点数或字符串(无函数)。我需要正则表达式这个字符串来创建类似的东西:

{
    foo: 'value',
    bar: 2.1,
    john: false
}

有图书馆或其他东西吗?

4

2 回答 2

0

根据您对输入数据的信任程度,您始终可以使用如下代码编写一个简单的函数(为简单起见,使用 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或者确保值是特定格式。

于 2013-02-15T11:14:29.260 回答
0

我接受了这个答案,这应该是您请求的一个良好开端,并添加了一些进一步的规则来处理不同的数据类型,也许这会有所帮助:

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

这是要测试的小提琴。

于 2013-02-15T11:07:39.870 回答