Ruby正则表达式gsub除了开始时的任何其他字符(电话号码)

时间:2017-02-15 09:10:59

标签: ruby regex gsub

我希望将以下格式或无效格式修改为有效的电话号码:

1 (639)-234-2323 => 6392342323
2 (042)-982-2234 => 0429822234
3 0974829-928  => 0974829928
4 +83246-983-34 => +832459834
5 +836(737)-898+78 => +83673789878

我可以使用此代码,如果给出了某个1-4,我可以正确地得到我的结果,但是如果5,我真的很疯狂。

row[1] = row[1].gsub('(','').gsub(')','').gsub('-','').gsub(' ','')

此示例用于导入文件。所以你不能指望用户提示。

我也可能会导入格式无效的记录,但只能格式化为已接受的电话号码(任何地方都有括号或任何+个标志)。

编辑我希望找到我的5给出示例的解决方案。由于我无法移除+符号,因此无法移除第一个符号。

编辑2 我在评论部分再次询问我需要包含这样的电话格式:

6 (+65)92349577 => +6592348577

@WiktorStribiżew建议以下正则表达式:s.gsub(/\A\(?(\+)|\D+/, '\1')来自他的原始答案(被接受的答案)

1 个答案:

答案 0 :(得分:3)

解决方案是捕获第一个+并匹配所有其他非数字符号:

s.gsub(/\A(\+)|\D+/, '\1')

请参阅regex demo

模式详情

  • \A(\+) - 一个+(被捕获到捕获组#1,因为它用捕获括号包裹)在字符串的开头(\A
  • | - 或
  • \D+ - 除了数字之外的一个或多个字符。

替换中的\1是对捕获组#1中存储的内容的反向引用,它会在替换结果中恢复初始+