使用正则表达式将字符串拆分为对象

时间:2013-07-10 19:50:43

标签: javascript regex

我有一个(约61000个)字符串,看起来像

"(((((((((.(((((.&.)))))))))))))) 11,26 : 6,20 (-9.37 = -16.05 + 6.56 + 0.13) GCCAACUGACGUUGUU&AAUAAUUCAGUUGGU"

字符串的每个部分之间有可变数量的空格(1-3)。

最终我想要的是将此字符串转换为javascript对象:

{
    parens: "(((((((((.(((((.&.))))))))))))))",
    sRNAstart: 11,
    sRNAend: 26,
    mRNAstart: 6,
    mRNAend: 20,
    netEnergy: -9.37,
    bindingEnergy: -16.05,
    sRNAOpenEnergy: 6.56,
    mRNAOpenEnergy: 0.13,
    sequences: "GCCAACUGACGUUGUU&AAUAAUUCAGUUGGU"
}

这听起来像是RegEx男人的工作,可悲的是我不是他。任何人都可以帮我找到实现这个目标的方法吗?

4 个答案:

答案 0 :(得分:4)

这是一种使用regexp来解析字符串的方法,对于那些讨厌的parens有一个内部解决方法:

var s="(((((((((.(((((.&.)))))))))))))) 11,26 : 6,20 (-9.37 = -16.05 + 6.56 + 0.13) GCCAACUGACGUUGUU&AAUAAUUCAGUUGGU";

var ob=s.split( /([\s]{1,4}|[,=+:()])/ )
     .filter( /./.test, /\w/ )
     .map(function(chunk, i){
        if(i===0) this.parens= s.split(" ")[0];
        this[[  "sRNAstart","sRNAend","mRNAstart","mRNAend","netEnergy",
                "bindingEnergy","sRNAOpenEnergy","mRNAOpenEnergy","sequences"
        ][i]]=  +chunk || (chunk==="0"? 0 : chunk);
       return this;
     },{})[0] ; //end ob


alert(
  JSON.stringify(
    ob,
    null,
    "\t"
  )
);

结果:

 {
    "parens": "(((((((((.(((((.&.))))))))))))))",
    "sRNAstart": 11,
    "sRNAend": 26,
    "mRNAstart": 6,
    "mRNAend": 20,
    "netEnergy": -9.37,
    "bindingEnergy": -16.05,
    "sRNAOpenEnergy": 6.56,
    "mRNAOpenEnergy": 0.13,
    "sequences": "GCCAACUGACGUUGUU&AAUAAUUCAGUUGGU"
}

编辑:删除使用非捕获的parens以获得更多x-browser compat与OLD浏览器。 编辑:调整:将“0”变为0,避免每次设置this.parens,格式化和参数清理。

答案 1 :(得分:3)

Javascript split() with multiple delimiters应该会生成所需的所有值的数组。

从那里开始,它是简单的字符串连接。

答案 2 :(得分:1)

此表达式不会确保括号匹配,但它应该会破坏模式中的所有内容。

([(.&)]+)\s*(\d+),(\d+)\s*:\s*(\d+),(\d+)\s*\(([-.\d]+)\s*=\s*([-.\d]+)\s*\+\s*([-.\d]+)\s*\+\s*([-.\d]+)\)\s*([GCAU&]+)

答案 3 :(得分:1)

这是一个替代方案,也应该适合您并且是跨浏览器。

的Javascript

function parse(string) {
    if (typeof string !== "string") {
        throw new TypeError("Attribute must be a string.");
    }

    var props = ["parens", "sRNAstart", "sRNAend", "mRNAstart", "mRNAend", "netEnergy", "bindingEnergy", "sRNAOpenEnergy", "mRNAOpenEnergy", "sequences"],
        array = string.split(/[)]?\s+[(:=+]?\s*|,/),
        object = {},
        value;

    if (array.length !== props.length) {
        throw new Error("String could not be converted.");
    }

    do {
        value = array.shift();
        object[props.shift()] = +value || value;
    } while (props.length);

    return object;
}

var ref = "(((((((((.(((((.&.)))))))))))))) 11,26 : 6,20 (-9.37 = -16.05 + 6.56 + 0.13) vGCCAACUGACGUUGUU&AAUAAUUCAGUUGGU";

for(var i = 0; i < 3; i += 1) {
    console.log(ref, parse(ref));
    ref = ref.replace(/(\s+)/g, function (all, whitespace) {
        return whitespace + " ";
    });
}

jsfiddle