我需要格式化源字符串中的电话号码,保留源字符串中数字的位置。
我有一个包含电话号码列表的任意字符串。它们被不规则地列出,散布着各种标记和标点符号,例如:
mobile:
标记前面的手机号码tel.:
标记在手机之前。它可以是任何版本,例如。 G。 Tel:
,tel. :
,tel.
,TEL:
。它可以在任何地方以任何数量出现。,
,.
,{space}
,{tab}
作为分隔符。通常,源字符串中的“电话号码”是符合regexp的字符串:
/[0-9 +()-]+/
因此,我可以使用上面的regexp在源字符串中的所有手机上成功匹配。但是,AFAIK我不能只str.replace(regexp, replacement)
,因为数字的处理将由libphonenumber完成。
我必须保留数字周围的所有噪音,因为它并不总是噪音。或者我只是将整个字符串重新格式化。
我想,这个问题可以推断如下:如何在正则表达式找到的所有子串上映射函数,但是没关系。
有没有办法做上面描述的内容?目标语言是Javascript(嗯,Adobe Illustrator脚本引擎可以解析的Javascript类型,绝对具体)。
实施例
语言是俄语。强制格式的手机是“国际的”(在libphonenumber文档中如何称呼)。
输入:Тел: (343) 378-33-00, моб.: +7(904) 54-73-818
所需的输出:Тел: 8 (343) 378-33-00, моб.: 8 (904) 547-38-18
这里只是重新格式化数字。代币Тел:
和, моб.:
保持不变。
输入:8(495) 941 93 20 моб. 8 915-295-62-86
所需的输出:8 (495) 941-93-20 моб. 8 (915) 295-62-86
这里我们也重新格式化了数字。令牌моб
保持不变,周围有空格。
输入:Тел: 8(495) 685-95-95 доб.:4093, моб.: +7(916) 885-11-58
所需的输出:Тел: 8 (495) 685-95-95 доб.:4093, моб.: 8 (916) 885-11-58
不要关心空间崩溃或正确放置标点符号,这将在处理的后期阶段完成。
答案 0 :(得分:2)
String.replace
可以将函数作为第二个参数,在这种情况下,为每个匹配调用函数,返回值是替换匹配的函数。
函数参数可以包括匹配或其他内容,基于它们的名称。您可以查看docs for replace了解更多详情。
无论如何,这似乎可以解决问题:
inputString = "Тел: (343) 378-33-00, моб.: +7(904) 54-73-818";
function replacer(match) {
// you would call libphonenumber here and return the formatted number
return "{" + match + "}";
};
outputString = inputString.replace(/[\-\+0-9 \(\)]+/g, replacer);
P.S。您拥有的正则表达式与电话号码匹配也存在一个小问题。例如,它只匹配“”,或只是“ - ”。避免这种情况的更好的正则表达式可能类似于:
/[\-\+\(]*[0-9][\-\+ \(\)0-9]*/g
这可能需要一些调整。