A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© H._张_♂ 中级黑马   /  2014-3-20 10:10  /  4779 人查看  /  15 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

前几天在做一道数字匹配题的时候,题目是这样的:写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一, 后面4位任意数字,最后5位为任意相同的数字。我当时立马去学习正则表达式,不过我看了半天都没有找到合适的方法,最后使用循环语句完成,代码如下:
  1. package com.itheima;

  2. import java.util.regex.Pattern;

  3. public class TestPattern {
  4.                        
  5.         public static void main(String[] args) {
  6.                
  7.                 boolean n = false ;
  8.                
  9.                 //运行时输入一个电话号码
  10.                 String s = args[0];
  11.                
  12.                 //创建一个字符数组,长度为10
  13.                 String[] sx = new String[10];
  14.                
  15.                 //以正则表达式对该数组依次赋值
  16.                 for(int i=0;i<10;i++){
  17.                        
  18.                                 sx[i] = "1[3458]\\d{4}"+i+"{5}";
  19.                 }
  20.                
  21.                 //用该号码以此同不同正则表达式比较
  22.                 for (int i=0;i<10;i++){
  23.                        
  24.                         Pattern p = Pattern.compile(sx[i]);
  25.                        
  26.                         Matcher m = p.matcher(s);
  27.                        
  28.                         n = m.matches();
  29.                        
  30.                         if(n == true){
  31.                                
  32.                                 //如果匹配成功则打印匹配成功
  33.                                 System.out.println("能够匹配");
  34.                                
  35.                                 //匹配成功结束剩下的匹配,否则影戏n的正确赋值
  36.                                 break;
  37.                                
  38.                         }
  39.                        
  40.                 }
  41.         if(n == false){
  42.                        
  43.                         //初始值n为false,如果没有匹配成功,则不会被改变,打印出无法匹配
  44.                         System.out.println("无法匹配");
  45.                                
  46.                 }
  47.                
  48.         }

  49. }
复制代码
那位朋友知道怎么样才能更简单的写出这个代码。?谢谢~

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

15 个回复

倒序浏览
  1. String regex = "1[3|4|5|8]{1}[0-9]{4}(\\d{1})\\1{4}";//还可以这么写有些麻烦1[3|4|5|8]{1}[0-9]{4}(1{5}|2{5}|3{5}|4{5}|5{5}|6{5}|7{5}|8{5}|9{5}|0{5})
  2.         String phoneNum1 = "14101022222";
  3.         String phoneNum2 = "13912366660";
  4.         System.out.println(phoneNum1.matches(regex));//结果:true
  5.         System.out.println(phoneNum2.matches(regex));//结果:false
复制代码

我自己这么写的,仅供参考

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
  1. (1[3458]\d{4})(\d)\2{4}
复制代码

这是我的写法。\2就是表示前面第二个匹配项。也就是第二个括号(\d).
\2{4}就是前面第二个括号里面的重复4次。也就是最后5个数字相同。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
  1. class Demo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String str = "13234611111";
  6.                 /*
  7.                         [1]匹配数字1
  8.                         [3458]是3458其中之一
  9.                         \\d{4}是4位任意数字
  10.                         (\\d)\\1{4}是5位为任意相同的数字
  11.                 */
  12.                 boolean b = str.matches("[1][3458]\\d{4}(\\d)\\1{4}");
  13.                 System.out.println(b);
  14.         }
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报

(\\d)\\1{4}是5位为任意相同的数字 这个\\1是在API文档里面哪一类?我怎么没有找到?
回复 使用道具 举报
class  RegexDemo
{
        public static void main(String[] args)
        {
                //System.out.println("Hello World!");
                regex();
        }
        public static void regex()
        {
                String str = "15541222222";
                String regex = "1[3458]\\d{4}(\\d)\\1{4}";
                boolean b = str.matches(regex);
                       
                System.out.println(b);
        }
}

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 上官睿鹏 于 2014-3-20 13:34 编辑
H._张_♂ 发表于 2014-3-20 13:09
(\\d)\\1{4}是5位为任意相同的数字 这个\\1是在API文档里面哪一类?我怎么没有找到? ...

\\1是表示正则表达式中的第一个括号内的内容也就是(\\d)。\\1{4}就表示第一个括号内的内容重复四次
回复 使用道具 举报
H._张_♂ 来自手机 中级黑马 2014-4-23 23:42:53
8#
上官睿鹏 发表于 2014-3-20 13:32
\\1是表示正则表达式中的第一个括号内的内容也就是(\\d)。\\1{4}就表示第一个括号内的内容重复四次
...

怎么理解组0表示整个表达式?
回复 使用道具 举报
素质 中级黑马 2014-4-27 19:43:00
9#
我觉得最简单的写法就是String regex="1[3458]\\d{4}\\d{5}";
回复 使用道具 举报
不错 学习了
回复 使用道具 举报
素质 发表于 2014-4-27 19:43
我觉得最简单的写法就是String regex="1[3458]\\d{4}\\d{5}";

能解释一下吗{:2_34:}
回复 使用道具 举报
青木郎 发表于 2014-3-20 13:12
class  RegexDemo
{
        public static void main(String[] args)

程序好像不能匹配正确的号码吧
回复 使用道具 举报
  1. public static boolean function(String tel)
  2.         {
  3.                 String regex = "1[3458]\\d{4}(\\d)\\1{4}";
  4.                
  5.                 boolean b = tel.matches(regex);
  6.                
  7.                 return b;
  8.         }
复制代码
回复 使用道具 举报
长知识,很有启发!
回复 使用道具 举报
本帖最后由 silencelj 于 2015-4-11 07:59 编辑

[1][3458][0-9]{4}(\\d)\1{4}
回复 使用道具 举报
String regex = "1[3458]\\d{4}(\\d)\\1{4}";

我这边用\1是不对的,只可以\\1
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马