是否有可能在正则表达式中更改两个组的位置

时间:2014-08-06 10:24:22

标签: javascript regex

我想解析复数,它由两个浮点数组成,其中一个以i或j结尾忽略大小写。并且还有许多空格和不同的分隔符。我现在有两组

/^\s*[0]*((?:\d+)?(?:[.\,]\d+)?)?(?:\s*\s*[0]?)?([+-]\s*(?:\d+)?(?:[.\,]\d+)?[i,j])?\s*/im

但是,7j + 8,65也是复数。好吧,我可以使用re im和im re子组制作超长正则表达式,但它绝对不可读。

问题:我可以在javascript中对长部分正则表达式进行分组并为其命名吗? (当然,我可以将部分正则表达式存储在字符串中并连接字符串,但它不是我要找的东西)。尽管他们的职位是否有可能进行无序匹配和捕获组?

P.S。这是一个爱好项目,所以我可以使用js 1.7的现代浏览器。

UPD

^\s*[0]* - 以空格和前导零开头 ((?:\d+)?(?:[.\,]\d+)?) - 十进制,然后可能是分隔符和十进制数 (?:\s*\s*[0]?) - 第二部分之前未使用的空格和前导零 ([+-]\s*(?:\d+)?(?:[.\,]\d+)?[i,j])? - 小数点后二部分以i,j和是,i和j包含在第二个捕获组中 ?\s*/im - 尾随空格。然后忽略大小写和多行

UPD

我做了解决方案,但现在它看起来像计算器

var parseComplex = function (str) {
    'use strict';
    var groups = str
            .replace(/\s/g, '')
            .match(/[+-]?(?:\d*)?(?:[.,]\d*)?(:?[i,j])?/gim),
        im = 0.0,
        re = 0.0,
        i,
        len = groups.length,
        grLen;
    for (i = 0; i < len; i += 1) {
        grLen = groups[i].length;
        if (groups[i] !== '') {
            if (groups[i].substr(grLen - 1).match(/[i,j]/i)) {
                im += parseFloat(groups[i].substr(0, grLen - 1));
            } else {
                re += parseFloat(groups[i]);
            }
        }
    }
    return {
        re: re,
        im: im
    };
}
console.log(parseComplex("1.23 + 0.9j - 7i"));
console.log(parseComplex("0.3i - 133"));
console.log(parseComplex("8 + 9.09J"));
console.log(parseComplex("3i + 8j"));

0 个答案:

没有答案