【问题标题】:Regex: Find first occurence and map to canonical value正则表达式:查找第一次出现并映射到规范值
【发布时间】:2015-05-14 23:25:23
【问题描述】:

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

1996 年卡特彼勒 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

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

【问题讨论】:

  • 方法是使用捕获组号来知道找到了什么。基本上如果组 m 存在 => CAT,如果组 n => KOMATSU 等。您所需要的只是设计您的模式来做到这一点。

标签: java javascript regex


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多