黑马程序员技术交流社区

标题: 关于正则表达式的一点疑问 [打印本页]

作者: H._张_♂    时间: 2014-3-20 10:10
标题: 关于正则表达式的一点疑问
前几天在做一道数字匹配题的时候,题目是这样的:写一个正则表达式,可以匹配尾号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. }
复制代码
那位朋友知道怎么样才能更简单的写出这个代码。?谢谢~
作者: 梵天的梦    时间: 2014-3-20 11:00
  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
复制代码

我自己这么写的,仅供参考
作者: leon_hm    时间: 2014-3-20 11:21
  1. (1[3458]\d{4})(\d)\2{4}
复制代码

这是我的写法。\2就是表示前面第二个匹配项。也就是第二个括号(\d).
\2{4}就是前面第二个括号里面的重复4次。也就是最后5个数字相同。
作者: 上官睿鹏    时间: 2014-3-20 11:35
  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. }
复制代码

作者: H._张_♂    时间: 2014-3-20 13:09
上官睿鹏 发表于 2014-3-20 11:35

(\\d)\\1{4}是5位为任意相同的数字 这个\\1是在API文档里面哪一类?我怎么没有找到?
作者: 青木郎    时间: 2014-3-20 13:12
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);
        }
}

作者: 上官睿鹏    时间: 2014-3-20 13:32
本帖最后由 上官睿鹏 于 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
上官睿鹏 发表于 2014-3-20 13:32
\\1是表示正则表达式中的第一个括号内的内容也就是(\\d)。\\1{4}就表示第一个括号内的内容重复四次
...

怎么理解组0表示整个表达式?
作者: 素质    时间: 2014-4-27 19:43
我觉得最简单的写法就是String regex="1[3458]\\d{4}\\d{5}";
作者: Conning    时间: 2014-5-24 21:21
不错 学习了
作者: troy健    时间: 2014-7-3 10:49
素质 发表于 2014-4-27 19:43
我觉得最简单的写法就是String regex="1[3458]\\d{4}\\d{5}";

能解释一下吗{:2_34:}
作者: troy健    时间: 2014-7-3 11:08
青木郎 发表于 2014-3-20 13:12
class  RegexDemo
{
        public static void main(String[] args)

程序好像不能匹配正确的号码吧
作者: 爽朗的菜籽    时间: 2014-10-9 10:53
  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.         }
复制代码

作者: 冬天的雪    时间: 2014-11-25 21:01
长知识,很有启发!
作者: silencelj    时间: 2015-4-10 22:40
本帖最后由 silencelj 于 2015-4-11 07:59 编辑

[1][3458][0-9]{4}(\\d)\1{4}
作者: 树懒    时间: 2015-7-21 15:15
String regex = "1[3458]\\d{4}(\\d)\\1{4}";

我这边用\1是不对的,只可以\\1




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2