我有一些像这样的输入数据:
1996 caterpiller d6推土机出售(约翰迪尔和小松也!)
我想匹配找到的第一个品牌名称并将其映射到其规范价值。
这是地图:
canonical regex
KOMATSU \bkomatsu\b
CAT \bcat(erpill[ae]r)?\b
DEERE \b(john )?deere?\b
我可以轻松地测试品牌是否在字符串中:
/\b(cat(erpill[ae]r)?|(john )?deere?|komatsu)\b/i.exec(...) != null
或第一场比赛是什么:
/\b(cat(erpill[ae]r)?|(john )?deere?|komatsu)\b/i.exec(...)[0]; //caterpiller
但是有没有一种快速或方便的方法将第一场比赛映射到我想要的真实值?
caterpiller => CAT
我是否需要找到第一个匹配项,然后针对地图中的所有模式进行测试?
我需要为10,000多个品牌做10,000多次投入:D
我可以循环地图,测试输入值,但是会找到地图中出现的第一个值,而不是输入。
答案 0 :(得分:1)
一个想法是将捕获组的编号与规范名称数组中的索引相关联。所以每个不同的品牌都必须有自己的编号:
var can = ['', 'KOMATSU', 'CAT', 'DEERE'];
// ^idx1 ^idx 2 ^idx 3
var re =/\b(?:(komatsu)|(cat(?:erpill[ae]r)?)|((?:john )?deere))\b/ig;
// ^ 1st grp ^ 2nd grp ^ 3rd grp
var text = '1996 caterpiller d6 dozer for sale (john deere and komatsu too!)';
while ((res = re.exec(text)) !== null) {
for (var i=1; i<4; i++) { // test each group until one is defined
if (res[i]!= undefined) {
console.log(can[i] + "\t" + res[0]);
break;
}
}
}
// result:
// CAT caterpiller
// DEERE john deere
// KOMATSU komatsu