Javascript:某种preg_match在每场比赛中都有回调?

时间:2014-03-24 21:37:54

标签: javascript regex

我正在尝试在Angular中实现动态服务(尽管Angular并不是那么重要),我无法弄清楚如何实现以下假设。

假设我有正则表达式,

// Should match a phone number
/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/

我想要一个方法,它将获取一个给定的字符串,可能是一段文本,找到与模式匹配的所有字符串,并在它们上运行一个方法,用它们所属的联系人替换电话号码在地址簿中。

var string = "555-790-2342 is one, 555-555-2344 is another."; 

我可以在pattern.test中查看是否匹配,我可以进行搜索和替换,但是,例如,如果搜索和替换不是一对一的,那么该过程会是什么?假设有一个结果列表,例如:

var numbers = {
    "555-790-2342" : "John Smith", 
    "555-555-2344" : "Bob Smith", 
    "555-324-2342" : "Dana Smith"
};

我希望每个模式匹配以命中数字对象,并使用数字对象中的相应名称(值)替换匹配的数字(键)。我完全不知道这怎么可行。

1 个答案:

答案 0 :(得分:4)

令人惊讶的鲜为人知的特征:

string.replace(/your regex here/g,function(match,sub1,sub2) {
    // for obvious reasons, use meaningful argument names!
    // now do stuff
    // optionally:
    return match;
});

在面值时,整个事情都是无操作,因为它不仅仅将未修改的匹配作为替换返回,而且还丢弃了生成的字符串(因为它没有分配给变量) 。但是这个回调可能有副作用,比如填充对象等等。

当然,如果您愿意,也可以return其他内容,例如return numbers[match];