我想解析复数,它由两个浮点数组成,其中一个以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"));