【问题标题】:Ruby regex gsub any other characters except + on start (phone number)Ruby 正则表达式 gsub 任何其他字符,除了 + 开始(电话号码)
【发布时间】:2017-02-15 09:10:59
【问题描述】:

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

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 给出的示例提供解决方案。因为如果不删除第一个,我无法在任何地方删除 + 标志。

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

6 (+65)92349577 => +6592348577

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

【问题讨论】:

  • 使用s.gsub(/\A(\+)|\D+/, '\1')
  • 抱歉,问题已更新。我想为我的5 给出的示例提供解决方案。因为如果不删除第一个,我无法在任何地方删除 + 标志。
  • @WiktorStribiżew 出色的答案.. 你能不能至少发布一个答案,这样我才能接受你的答案?感谢您的快速回复。
  • @DanielChristiany 抱歉问题含糊。我应该在row[1] = row[1].gsub('(','').gsub(')','').gsub('-','').gsub(' ','') 之前回答我的问题
  • 然后把括号移到组外——s.gsub(/\A\(?(\+)|\D+/, '\1')

标签: ruby regex gsub


【解决方案1】:

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

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

regex demo

模式详情

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

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

【讨论】:

  • 为什么括号是必需的+ 符号?
  • @akuhn:第一个替代分支值必须保留在最终结果中。为了能够将此文本放回替换结果中,该值应存储在使用捕获组创建的某个内存插槽中。 (...) 创建捕获,因此可以保留字符串开头的 +。我们匹配并捕获我们需要保留的内容,并且只匹配我们需要删除的内容。
  • @WiktorStribiżew 哇!很好的答案和解释。谢谢!我还在学习这个正则表达式的东西,我只需要处理当前需要完成的任务。伟大的!谢谢!
  • 哦,因为另一种选择没有捕获,所以它被什么都取代了。太聪明了,哈哈哈!
  • @akuhn:是的,如果捕获组不参与比赛,则可以将反向引用值设置为空字符串。在 3.5 版之前的 Python re 中并非如此,但在 Onigmo 和许多其他正则表达式引擎中运行良好。
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 2017-09-23
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
相关资源
最近更新 更多