首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用perl验证电话号码

使用perl验证电话号码
EN

Stack Overflow用户
提问于 2019-02-25 08:23:37
回答 2查看 792关注 0票数 1

我想用以下条件验证电话号码:

  1. 长度应为10位数
  2. 应该从7或8或9开始

如果它不符合这些要求,我们就不能满足这个数字。

我尝试了以下几点:

代码语言:javascript
复制
print "Enter phone number: \n";
$name=<>;
chomp $name;

if (length($name)==10 && $name==~  m{/[^7-9]/}){
  print "$name is valid \n";
}
else {
  print "$name is not valid \n";
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-25 08:25:53

我只需要用一个正则表达式:

代码语言:javascript
复制
^[789][0-9]{9}$

这就避免了将验证逻辑分散到几个地方。

代码语言:javascript
复制
if ($name =~ m{/^[789][0-9]{9}$/}){
    print "$name is valid \n";
}
else {
    print "$name is not valid \n";
}
票数 2
EN

Stack Overflow用户

发布于 2019-02-25 09:21:58

也许值得解释一下你原来的版本到底出了什么问题。你有两张支票。第一个(length($name)==10)很好。问题在于第二个问题。

$name==~ m{/^7-9/}

这里有三个问题。首先,你用错了接线员。您知道需要将变量($name)绑定到匹配运算符,但绑定运算符是=~而不是==~。但是,不幸的是,您的操作符没有错误到抛出语法错误。Perl将将其解释为一个数字比较(==),然后是按位否定(~)。这肯定不是你想要的!

第二个问题是匹配操作符。看起来,您知道匹配运算符是m/.../,并且您也知道可以为匹配运算符选择另一个分隔符--您已经选择了m{...}。但你不应该嵌套那些分隔符。当您使用m{/.../}时,您正在查找字符串中的两个文字字符/

最后,您的实际正则表达式有一个问题。您希望字符串以7、8或9开头。将这些数字放入字符类([7-9])是个好主意。但是,您也不应该将字符串锚(^)的开始放在字符类中。在字符类的开头,^有一个不同的含义--意思是“这里列出的字符中没有一个”。所以你的角色类最终意味着与你想要的完全相反的意思。

您的匹配表达式应该如下所示:

代码语言:javascript
复制
$name =~ m{^[7-9]}

编写完整的代码:

代码语言:javascript
复制
print "Enter phone number: \n";
$name = <>;
chomp $name;

if (length($name) == 10 and $name =~  m{^[7-9]}) {
  print "$name is valid \n";
}
else {
  print "$name is not valid \n";
}

(我做了一些整理工作-在运营商周围添加一些空格,并将&&转换为and,因为is的优先级较低。)您还可以考虑修改变量名。$name不是一个包含电话号码的变量的很好的名称!)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54862088

复制
相关文章

相似问题

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