Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby regex gsub除+;启动时(电话号码)_Ruby_Regex_Gsub - Fatal编程技术网

Ruby regex gsub除+;启动时(电话号码)

Ruby regex gsub除+;启动时(电话号码),ruby,regex,gsub,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

我希望对工作电话号码纠正以下格式或无效格式:

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')
根据他的原始答案(被接受的答案)

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

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

图案细节

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

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

Use
s.gsub(/\a(+)\D++/,“\1”)
对不起,问题已更新。我想对给定的示例中的
5
找到一个解决方案。因为我不能在任何地方删除
+
符号而不删除第一个。@WiktorStribiż新的精彩答案。你能至少发布一个答案,这样我就可以接受你的答案吗?谢谢你的快速回复。@DanielChristiany对于含糊不清的问题,我很抱歉。我正如在
行[1]=行[1].gsub(“(”,“).gsub(“)”,”).gsub(“-”,“).gsub(“)”),”)之前剪切我的问题一样,
然后将括号移到组外-
s.gsub(/\A\(?(\+)\D+/,“\1”)
。为什么需要
+
符号?@akuhn:第一个可选分支值必须保留在最终结果中。为了能够将此文本放回替换结果中,该值应该存储在使用捕获组创建的某个内存插槽中。
(…)
创建捕获,这样就可以保留字符串开头的
+
。我们匹配并捕获需要保留的内容,然后只匹配需要删除的内容。@WiktorStribiżew-Woah!非常好的回答和解释。谢谢!我还在学习这个正则表达式,我只需要处理当前需要完成的任务。Great!谢谢!噢,因为另一个替代方案没有捕获,所以它被什么都没有替换。太聪明了,哈哈哈!@akuhn:是的,如果捕获组没有参与匹配,那么backreference值设置为空字符串是可能的。在3.5版之前的Python
re
中不是这种情况,但在3.5版之前一直工作良好Onigom和许多其他正则表达式引擎。