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

标签 java javascript regex

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

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/

相关文章:

java - 无法使用 Eclipse 和 Tomcat 9 访问 servlet

Java 的新 Scanner vs Scanner.create()?

javascript - 是删除对函数的引用,还是删除函数的实例?

MySQL 正则表达式 json

java - Java 中的继承与静态

Java TimerTask 不更新静态字段

javascript - SAP cloud sdk for javascript multiple and filters直接附加: leads to "Expression can not converted into ABAP select options" on backend

javascript - 为什么 jquery-file upload 总是发送单个文件到后端

regex - JavaScript 正则表达式中多个正向前瞻的语法

regex - Perl 重新否定后面的可变长度错误