JAVA正则表达式

Posted 朝圣之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA正则表达式相关的知识,希望对你有一定的参考价值。

  以前对正则表达式进行过应用,但也都是随查随用,但适合别人的不一定适合自己。今天有时间对正则表达式在JAVA中的应用进行下系统的整理。

  tips:正则表达式的学习建议在进行过简单了解后,结合实例进行学习,多看,多用才可以掌握。

What?正则表达式是什么?

  正则表达式是一串表达文本规则的字符串(代码)。可以用来对文本进行搜索、编辑或处理。并且正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。

  在JAVA中正则表达式最常用的方式是规则匹配和文本筛选。

  例:

  规则匹配:判断字符串是否为Url格式

  文本筛选:  从"abcd123" 中捕获数字。

How?怎么用?

  正则表达式语法

    网上这样的文章铺天盖地,这里就不再赘述,个人推荐感觉比较全面的网站 www.runoob.com/java/java-regular-expressions.html

  着重记录语法

字符 说明
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与" "或" "之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与" "或" "之前的位置匹配。
*  零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。
+ 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。
零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。
(pattern) 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0…$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"("或者")"。
{n,m} mn 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。
[abc] 字符集。匹配包含的任一字符。
[^xyz] 反向字符集。匹配未包含的任何字符。
[a-z] 字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。
d 数字字符匹配。等效于 [0-9]。
D 非数字字符匹配。等效于 [^0-9]。
s 匹配任何空白字符,包括空格、制表符、换页符等。与 [ f v] 等效。

  举例练习

  1、数字

    answer:^[0-9]+$

  2、基本汉字

    answer:^[u4E00-u9FA5]+$

 

  3、英文字符

    answer:^[a-zA-Z]+$

 

  4、QQ号:全数字,限制5-13数,不能以0开头

   answer:  [1-9]d{4,12}

  5、身份证号

    answer:^(\d{15})|(\d{18})$

 

  6、E-mail校验

    answer:^[a-zA-Z0-9]+\w*@[a-zA-Z0-9]+(\.[a-z]{2,3})+

 

  7、URL

    answer:(^((http|HTTP|https|HTTPS|ftp|FTP)://))?((([0-9]{1,3}.){3}[0-9]{1,3})|((([0-9a-z_!~*‘()-]+.)*([0-9a-z][0-9a-z-]{0,61})?[0-9a-z].[a-z]{2,6})(:[0-9]{1,4})?((/?)|(/[0-9a-zA-Z_!~*().;?:@&=+$,%#-/]*)?)))$

 

  

  JAVA中应用

/**
     * 数字校验:不限制数字位数
     */
    @Test
    public void test1(){
        String regex = "^[0-9]+$";
        String content = "00";
        boolean matches = Pattern.matches(regex, content);
        System.out.println(matches);
    }

    /**
     * 基本汉字匹配,不包含生僻字
     * 编码范围      4E00-9FA5
     */
    @Test
    public void test2(){
        String regex = "^[u4E00-u9FA5]+$";
        String content = "测试1111测试";
        boolean matches = Pattern.matches(regex, content);
        System.out.println(matches);
    }

    /**
     * 英文字符
     */
    @Test
    public void test3(){
        String regex = "^[a-zA-Z]+$";
        String content = "aAbxs";
        boolean matches = Pattern.matches(regex, content);
        System.out.println(matches);
    }

    /**
     * 身份证号校验 15位/18位
     */
    @Test
    public void test4(){
        String regex = "^(\d{15})|(\d{18})$";
        String content = "411411198812046616";
        boolean matches = Pattern.matches(regex, content);
        System.out.println(matches);
    }

    /**
     * E-mail 校验
     * 规则:1、不可以有特殊字符,不包括下划线
     *      2、含有@
     *      3、含有.
     */
    @Test
    public void test5(){
        String regex = "^[a-zA-Z0-9]+\w*@[a-zA-Z0-9]+(\.[a-z]{2,3})+";
        String content = "[email protected]";
        boolean matches = Pattern.matches(regex, content);
        System.out.println(matches);
    }


    /**
     * URL 校验
     * 规则: 网路转载
     */
    @Test
    public void test6(){
        String regex = "(^((http|HTTP|https|HTTPS|ftp|FTP)://))?"+ //协议校验
                       "((([0-9]{1,3}\.){3}[0-9]{1,3})"+ //IP校验
                        "|"+                        //domain校验
                        "((([0-9a-z_!~*\‘()-]+\.)*"+  //三级域名
                        "([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\."+    //二级域名
                        "[a-z]{2,6})"+          //顶级域名
                        "(:[0-9]{1,4})?"+       //端口
                        "((\/\?)|"+           //文件校验
                        "(\/[0-9a-zA-Z_!~\*\‘\(\)\.;\?:@&=\+\$,%#-\/]*)?)))$";
        String content = "https://www.oschina.net/code/snippet_2276973_44166";
        boolean matches = Pattern.matches(regex, content);
        System.out.println(matches);
    }

 

以上是关于JAVA正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

java 字符串替换

text 正则表达式片段

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

java正则表达式去除html标签

循环通过 python 正则表达式匹配