关于正则表达式的一些常用困惑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27416233/article/details/78721195
前言:因为业务需要需要匹配出文档中特定的数据,并且赋值到到特定的数组上面,
    所以需要用到特定的关系进行匹配,正则表达式是一个不错的选择,但是毕竟
    是普通人所以没办法!习惯性遗忘...说句实话还是用的少的原因,下面简单的
    复习下为了以后自己看,简单的做下笔记,虽然今天的事蛮多的,还有一道算法
    没有写完,我会努力的
正则表达式
基本概念:正则表达式本质上是一个字符串,用于格式的验证,匹配,查找,替换等,为了与
        普通的字符串进行区分,该字符串通常使用"^"开头,使用"&"结尾,可以省略。

常用的规则:
-[abc]   - 表示可以出现a,b以及c.
-[^abc]  - 表示可以出现任何字符除a,b,c.
-[a-zA-Z]- 表示可以出现任何字母,也就是a到z和A到Z之间的任意字符.

-\d -表示可以出现任何数字,相当于[0-9].
-\D -表示可以出现任何非数字,相当于[^0-9].
-\s -表示可以出现任何空白字符,相当于[\t\n\xob\f\r].
-\S -表示可以出现任何非空白字符,相当于[^\s].
-\w -表示可以出现单词字母,相当于[a-zA-Z_0-9],就是字母数字下划线.
-\W -表示可以出现任何非单词字符,相当于[^\w].

-X? -表示X可以出现一次或者一次也没有,也就是可以出现0~1次.
-X* -表示X可以出现零次或多次,也就是可以去出现0~n次.
-X+ -表示X可以出现一次或者多次,也就是可以出现1~n次.
-X{n}   -表示X恰好出现n次.
-X{n,}  -表示X可以出现至少n次,也就是 >=n次
-X{n,m} -表示X可以出现至少n次,但是不超过m次,也就是 >=n次并且<=m次

提示:有的时候String类中的split()方法可以进行字符串拆分.
下面写几个实例:
1) 描述银行卡密码的规则:要求必须是数字,而且必须是6位
    String reg = "^\d{6}&";
    但是很遗憾这样子写是错误的,因为在Java中存在一个转义问题正确的写法如下:
    String reg = "^\\d{6}&";

2) 描述用户名的规则,要求由6 ~ 8位数字字母以及下划线组成
    String reg = "^\\w{6,8}&";

3) 描述座机号码的规则,要求3~4位区号由数字组成、-、7~8位数字组成的号码
    String reg = "^\\d{3,4}[-]{1}\\d{7,8}&";

4) 描述手机号码的规则,要求11位数字组成,第一位必须是1
    String reg = "^[1]{1}\\d{10}";

5) 描述身份证号的规则,要求总共18位,前面17位必须是数字,后面1位可以是数字也可以X
    String reg = "^\\d{17}\\[0-9x]{1}&";
6) 描述邮箱的规则,要求邮箱名必须由数字字母下划线组成,至少一位,@,
   分析:常见的邮箱后缀为@qq.com,@126.com,@org.com反正我就见到过这三种   
    String reg = "^\\w+[@]{1}[0-9a-zA-Z]{2,4}(.com.cn.com.cn|.org)$";

提示:如果需要过滤或者替换...上面说过了.忘了的自己去翻,号我自己翻回去看看一般用到了String里
面的方法.
以下方法全部参考自JDK api 1.6(1.8还没有追,更别说1.9了...)

a.如果判断是否符合特定的格式
    String str = "[email protected]"; //需要验证的字符串
    String reg = "^\\w+[@]{1}[0-9a-zA-Z]{2,4}(.com|.cn|.com.cn|.org)$";//验证的格式

    boolean boo = str.matches(reg);

    调用此方法的 str.matches(regex) 形式与以下表达式产生的结果完全相同: 

    Pattern.matches(regex, str)

    参数:
    regex - 用来匹配此字符串的正则表达式 
    返回:
    当且仅当此字符串匹配给定的正则表达式时,返回 true 

附加匹配信息:
    我们在工作中难免会碰到汉字的可能性,查了下资料发现匹配的公式是这个样子的:
    [\u4E00-\u9FA5]  需要注意的一点是前后并不能加 '^','&'或者是两个全家,至于原因以后我会补上

下面补充一个例子:
7)      
        String str = "规划路线的坐标 x541y440";
        String reg = "[\u4E00-\u9FA5]+\\s+\\w+"; 
        if(str.matches(reg)){
            System.out.println("匹配成功!");
        }else{
            System.out.println("匹配失败!");
        }

经过验证是没有问题的.

我复习正则表达式的目的

以下是部分验证代码:

    String str1 = "12-01 21:"; //暂时先来验证这一段字符串
    String str2 = "12-01";
    String str3 = "12-01 21:34:36.401";
    String str4 = "12-01 21:34:36.401 719-719/";
    String str5 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out:";
    String str6 =  "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out: 规划路线的坐标 x577y96";
    /** 根据我的分析是这个样子的**/
    String regex =  "^\\d+[-]+\\d+\\s+\\d+[:]+";
    String regex3 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+";
    String regex4 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+";
    String regex5 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+";
    String regex6 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+\\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+\\w+";

    if(str6.matches(regex6)){
        System.out.println(1);
    }else{
        System.out.println(0);
    }

下面根据String提供的方法split进行分割

    public String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。 
    该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括结尾空字符串。 

    例如,字符串 "boo:and:foo" 使用这些表达式可生成以下结果: 

    Regex 结果 
    : { "boo", "and", "foo" } 
    o { "b", "", ":and:f" } 


    参数:
    regex - 定界正则表达式 

    也就是把跟表达式相同的部分全部过滤掉了,且返回的类型是一个String[]很有意思
    下面是拆分之后的代码

    // 先来验证一部分字符串
    String str1 = "12-01 21:"; //暂时先来验证这一段字符串
    String str2 = "12-01";
    String str3 = "12-01 21:34:36.401";
    String str4 = "12-01 21:34:36.401 719-719/";
    String str5 = "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out:";
    String str6 =  "12-01 21:34:36.401 719-719/com.hiteam.ghyj I/System.out: 规划路线的坐标 x577y96";
    /** 根据我的分析是这个样子的**/
    String regex =  "^\\d+[-]+\\d+\\s+\\d+[:]+";
    String regex3 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+";
    String regex4 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+";
    String regex5 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+
                     \\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+";
    String regex6 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+
                    \\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+\\w+";
    /** 根据需求知道我需要截取的是后面的x和y那么如下:**/
    String regex7 = "^\\d+[-]+\\d+\\s+\\d+[:]+\\d+[:]+\\d+[.]+\\d+\\s+\\d+[-]+\\d+[/]+
                    \\w+[.]+\\w+[.]+\\w+\\s+\\w+[/]+\\w+[.]+\\w+[:]+\\s+[\u4E00-\u9FA5]+\\s+";
    if(str6.matches(regex6)){
        System.out.println(1);
    }else{
        System.out.println(0);
    }
    String[] strValue = str6.split(regex7);
    for(int i = 0; i < strValue.length; i++){
        if(!"".equals(strValue[i])){

            System.out.println(strValue[i]);
        }
    }
输出结果为:
1
x577y96
是没有问题的,感觉收获蛮大的.争取一周更新两篇博客.

人生为棋,我愿为卒,行动虽慢,可谁见我都会后退一步...

猜你喜欢

转载自blog.csdn.net/qq_27416233/article/details/78721195