0

我需要格式化在源字符串中找到的电话号码,保留源字符串中数字的位置

我有一个包含电话号码列表的任意字符串。它们不规则地列出,穿插着各种标记和标点符号,例如:

  • mobile:手机号码前的标记
  • tel.:通常在电话之前标记。它可以是任何版本,例如Tel:, tel. :, tel., TEL:。它可以以任何数量出现在任何地方。
  • ,, ., {space},{tab}作为分隔符。

一般来说,源字符串中的“电话号码”是一个符合正则表达式的字符串:

/[0-9 +()-]+/

因此,我可以使用上述正则表达式成功匹配源字符串中的所有电话。但是,我不能只做 AFAIK str.replace(regexp, replacement),因为数字的处理将由libphonenumber完成。

我必须保留数字周围的所有噪音,因为它并不总是噪音。或者我只是统一地重新格式化整个字符串。

我想,这个问题可以推断如下:如何将函数映射到正则表达式找到的所有子字符串上,但没关系。

有什么办法可以做上面描述的事情吗?目标语言是 Javascript(确切地说,是 Adob​​e 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

不要关心空格折叠或正确放置标点符号,它将在处理的后期阶段完成。


4

1 回答 1

3

String.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);

PS 还有一个与电话号码匹配的正则表达式的小问题。例如,它将仅匹配“”,或仅匹配“-”。避免这种情况的更好的正则表达式可能类似于:

/[\-\+\(]*[0-9][\-\+ \(\)0-9]*/g

这可能需要一些调整。

于 2013-10-25T10:38:31.827 回答