我有一些像这样的输入数据:
1996 caterpiller d6 dozer for sale (john deere and komatsu too!)
我想匹配找到的第一个品牌名称并将其映射到其规范值。
这是 map :
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
我是否需要找到第一个匹配项,然后针对 map 中的所有模式进行测试?
我需要针对 10,000 多个品牌进行 10,000 多个输入:D
我可以循环 map ,针对输入值进行测试,但这会找到 map 中出现的第一个值,而不是输入。
最佳答案
一个想法是将捕获组的编号与规范名称数组中的索引相关联。所以每个不同的品牌必须有自己的编号:
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
关于java - 正则表达式:查找第一次出现并映射到规范值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249102/