首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带替换和选项的正则表达式

带替换和选项的正则表达式
EN

Stack Overflow用户
提问于 2012-09-24 20:36:27
回答 1查看 204关注 0票数 0

我正在尝试写一个正则表达式来修改电话号码。如果它是一个国际号码(非美国),我希望保留+符号(%2B后被URL编码)。如果它是一个国内号码,%2B应该被剥离,并更改为11位格式与一个1在前面。

这4个用例是:

  • %2B2125551000变成0112125551000(这应该被看作是一个国际数字,因为它以+[2-9]开头--用011代替+ )
  • %2B12125551000变成12125551000 (因为这是+1,它是一个国内号码,去掉+)
  • 2125551000变成12125551000 (没有+的国内号码)
  • 12125551000变成12125551000 (没有+的国内号码)

我一直试图在Linux上使用sed测试它:

进行匹配的表达式是:

代码语言:javascript
复制
((%2B)|)?((1)|)?([0-9]{10})

然而,我不一定总是需要所有的5个论点。我只需要在字符串为%2B的情况下保留%2B[2-9]

代码语言:javascript
复制
$ for line in %2B2125551000 %2B12125551000 12125551000 2125551000;do echo $line | sed -r 's/^((%2B|))?((1)|)?([0-9]{10})/one:\1   two:\2   three:\3   four:\4   five:\5/';done
one:%2B   two:%2B   three:   four:   five:2125551000
one:%2B   two:%2B   three:1   four:1   five:2125551000
one:   two:   three:1   four:1   five:2125551000
one:   two:   three:   four:   five:2125551000
EN

回答 1

Stack Overflow用户

发布于 2012-09-24 21:07:14

好吧,让我看看,你想要什么:

代码语言:javascript
复制
s/^%2B(?=[2-9])/011/ || # this will do first rule and change %2B to 011  
s/^%2B(?=1)// ||        # this will do second rule and strip off %2B  
s/^(?:[2-9])/1$&/ ;     # this will do third rule and add 1 to the beginning of the number  

# Perl code 
my @all = <DATA>;

for (@all){
    s/^%2B(?=[2-9])/011/ or 
    s/^%2B(?=1)// or
    s/^(?:[2-9])/1$&/ ; 
    print "line is $_ \n";  
}

__DATA__
%2B2125551000
%2B1125551000
225551000
125551000
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12572525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档