如何将所有电话号码格式化为字符串(javascript)

如何将所有电话号码格式化为字符串(javascript),javascript,regex,formatting,libphonenumber,Javascript,Regex,Formatting,Libphonenumber,我需要格式化在源字符串中找到的电话号码,保留号码在源字符串中的位置 我有一个包含电话号码列表的任意字符串。它们被不规则地列出,中间点缀着各种标记和标点符号,例如: mobile:标记手机号码 tel.:marker前面的电话。它可以是任何版本,例如。g电话:,电话:,电话,电话:。它可以出现在任何地方和任何数量 ,,,{space},{tab}作为分隔符 通常,源字符串中的“电话号码”是符合regexp的字符串: /[0-9 +()-]+/ 因此,我可以使用上面的regexp成功匹配源字

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

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

  • mobile:
    标记手机号码
  • tel.:
    marker前面的电话。它可以是任何版本,例如。g<代码>电话:,
    电话:
    电话
    电话:
    。它可以出现在任何地方和任何数量
  • {space}
    {tab}
    作为分隔符
通常,源字符串中的“电话号码”是符合regexp的字符串:


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

因此,我可以使用上面的regexp成功匹配源字符串中的所有电话。但是,AFAIK I不能只执行str.replace(regexp,replacement),因为数字的处理将由用户完成

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

我想,这个问题可以推断为:如何将一个函数映射到正则表达式找到的所有子字符串上,但不必考虑

有没有办法做到上面所描述的?目标语言是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б。8915-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

不要在意空格的折叠或标点符号的正确放置,这将在以后的处理阶段完成



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);
另外,与电话号码匹配的正则表达式也有一个小问题。例如,它将只匹配“”,或只匹配“-”。避免这种情况的更好的正则表达式可能是:

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

这可能需要一些调整。

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);
另外,与电话号码匹配的正则表达式也有一个小问题。例如,它将只匹配“”,或只匹配“-”。避免这种情况的更好的正则表达式可能是:

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

这可能需要一些调整。

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);
另外,与电话号码匹配的正则表达式也有一个小问题。例如,它将只匹配“”,或只匹配“-”。避免这种情况的更好的正则表达式可能是:

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

这可能需要一些调整。

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);
另外,与电话号码匹配的正则表达式也有一个小问题。例如,它将只匹配“”,或只匹配“-”。避免这种情况的更好的正则表达式可能是:

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


这可能需要一些调整。

您能给出一个源代码的示例,以及您希望它以后的样子吗?已交付。正如我所说的,我希望所有数字的格式都是8(xxx)xxx xx xx,8是在俄罗斯进行国际移动的代码。可能喜欢循环吗?@Dude你的意思是完全删除regexp并编写完整的基于状态的机器,然后逐个字符地遍历字符串?好吧,如果没有其他选择的话,我会这么做,但是可能有像
regexpMap
这样的东西被我遗漏了。是的。这就是我的意思。当然,如果你能找到一些内置的函数来简化这个过程,越多越好。你能举一个源代码的例子,然后你希望它看起来像什么吗?已交付。正如我所说的,我希望所有数字的格式都是8(xxx)xxx xx xx,8是在俄罗斯进行国际移动的代码。喜欢循环吗?@Dude你的意思是放弃rege