【发布时间】:2016-09-16 19:21:57
【问题描述】:
我在创建一个程序来根据我设置的规则检查文档的出现次数时遇到了巨大的困难。在正则表达式的帮助下,我检查了一些字段,如果存在特定字段,我可以计算它出现的次数,或者我创建更深入的扫描。有点混乱,不知道具体怎么解释。
我正在检查文本文件,但为了降低复杂性,我将使用数组。
我有以下数组:
let strings = [
'COMPANY: NAME ID: 12',
'COMPANY: NAME ID: 12',
'COMPANY: NAME ID: 12',
'COMPANY: NAME2 ID: 10'
];
这是欲望输出:
{
'NAME' : { '12': 3 },
'NAME2': { '10': 1 }
}
为了实现这一点,我需要做一些检查,所以我想出了以下“地图”:
let patterns = [
{
'pattern': 'COMPANY:\\s*?([\\w]+)\\s',
'modifier': ''
},
{
'pattern' : 'ID:\\s*?(\\d{2})\\s*',
'modifier' : ''
}
];
我很难创建伪代码,我知道这是可以递归完成的,但我被卡住了。最大的问题是因为嵌套,我可以嵌套几级,不一定是两级。
在过去的几个小时里,我创建了以下代码:
'use strict';
let patterns = [
{
'pattern': 'COMPANY:\\s*?([\\w]+)\\s',
'modifier': ''
},
{
'pattern' : 'ID:\\s*?(\\d{2})\\s*',
'modifier' : ''
}
];
let strings = [
'COMPANY: NAME ID: 12',
'COMPANY: NAME ID: 12',
'COMPANY: NAME ID: 12',
'COMPANY: NAME2 ID: 10'
];
var _data = {};
for (let string of strings) {
var root = _data;
for (let i = 0, length = patterns.length; i < length; i++) {
let item = patterns[i];
let regex = new RegExp(item.pattern, item.modifier);
let result = regex.exec(string);
if (i < patterns.length -1) {
root = root[result[1]] = {};
} else {
root = root[result[1]] = 1;
}
}
}
document.body.innerHTML = JSON.stringify({_data});
现在我正在尝试获取最后一部分,计算出现的次数,这真是令人头疼。也许递归或生成器可以解决这个问题。
更新 -
理解应该与 3、4、5 对象一起使用是很重要的。示例:
let patterns = [
{
'pattern': 'COMPANY:\\s*?([\\w]+)\\s',
'modifier': ''
},
{
'pattern' : 'ID:\\s*?(\\d{2})\\s*',
'modifier' : ''
},
{
'pattern' : 'SOMETHING:\\s*?(\\d+)\\s*',
'modifier' : ''
}
];
let strings = [
'COMPANY: NAME ID: 12 SOMETHING: 1010',
'COMPANY: NAME ID: 12 SOMETHING: 1010',
'COMPANY: NAME ID: 12 SOMETHING: 1010',
'COMPANY: NAME2 ID: 10 SOMETHING: 1010'
];
输出应该是:
{
'NAME': {
'12': {
'1010': 3
}
},
'NAME2': {
'10': {
'1010': 1
}
}
}
【问题讨论】:
标签: javascript regex