正则表达式:找到第一次出现并映射到规范值

时间:2015-05-14 23:25:23

标签: java javascript regex

我有一些像这样的输入数据:

  

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

我可以循环地图,测试输入值,但是会找到地图中出现的第一个值,而不是输入。

1 个答案:

答案 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