Java 正则表达式

Posted

tags:

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

package com.fish.regex;
/*
 
 正则表达式:正则表达式就是用于操作字符串的一个规则,正则表达式的规则使用特殊的符合表示
 
 需求:检验一个QQ号
 1、不能以0开头
 2、长度5-11
 3、只能由数字组成
 
 校验邮箱、校验***号码,校验手机号
 */
 
 
public class Demo1 {
    public static void main(String[] args) {
        String qq = "1234557";
        /*if(!qq.startsWith("0")){
        if(qq.length()>=5 && qq.length()<=11){
            try {
                Long.parseLong(qq);
                System.out.println("恭喜你,你得到了一个合法QQ");
            } catch (Exception e) {
                // TODO: handle exception
                System.out.println("非法QQ,QQ号只能由数字组成");
            }
            }else {
                System.out.println("非法QQ,QQ号的长度只能是5~11位");
            }
        }else{
            //以0开头
            System.out.println("非法QQ,QQ号不能以0开头");
        }*/
        System.out.println(qq.matches("[1-9]\\d{4,10}")?"合法QQ":"非法QQ");
    }
}


package com.fish.regex;
public class Demo2 {
    public static void main(String[] args) {
       
        /*
        预定义字符类 
        . 任何字符(与行结束符可能匹配也可能不匹配) 
        \d 数字:[0-9] 
        \D 非数字: [^0-9] 
        \s 空白字符:[ \t\n\x0B\f\r]  \r回车 \n 换行
        \S 非空白字符:[^\s] 
        \w 单词字符:[a-zA-Z_0-9] 
        \W 非单词字符:[^\w]
        注意:任何预定义字符没有加上数量词之前都只能匹配一个字符而已
        */
       
        System.out.println("任意字符:"+"%".matches("."));
        System.out.println("数字字符:"+"12".matches("\\d"));
        System.out.println("非数字字符:"+"@".matches("\\D"));
        System.out.println("空白字符:"+"\r".matches("\\s"));
        System.out.println("非空白字符:"+"\n".matches("\\S"));
        System.out.println("单词字符:"+"".matches("\\w"));
        System.out.println("非单词字符:"+"@".matches("\\W"));
       
        /*
        Greedy 数量词 
        X? X,一次或一次也没有 
        X* X,零次或多次 
        X+ X,一次或多次 
        X{n} X,恰好 n 次 
        X{n,} X,至少 n 次 
        X{n,m} X,至少 n 次,但是不超过 m 次 
        */
       
        System.out.println("?一次或一次也没有:"+"1".matches("\\d?"));
        System.out.println("* 零次或多次:"+"1".matches("\\d*"));
        System.out.println("+ 至少出现一次:"+"1".matches("\\d+"));
        System.out.println("{次数} 恰好出现n次:"+"12345678901".matches("\\d{11}"));
        System.out.println("{次数,} 至少要出现指定的次数:"+"12345678901".matches("\\d{3,}"));
        System.out.println("{次数1,次数2} 指定出现次数的范围:"+"12345".matches("\\d{3,4}"));
       
        /*
        范围词
        [abc] a、b 或 c(简单类) 
        [^abc] 任何字符,除了 a、b 或 c(否定) 
        [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
        注意:范围词里面不管内容有多长,没有数量词的匹配都只能匹配一个字符而已
        */
       
        System.out.println("abc".matches("[abc]"));
        System.out.println("@".matches("[^abc]"));
        System.out.println("字符可有出现在a-z之间"+"a".matches("[a-zA-Z#]"));
    }
}


package com.fish.regex;
import java.util.Arrays;
/*
 正则表达式主要是用于操作字符串的规则,正则表达式对字符串的操作主要有以下几种应用
 匹配: matches()
 切割:split()
 替换 :replaceAll(String regex, String replacement)
 查找:
 */
public class Demo3 {
    public static void main(String[] args) {
    matchesPhone("1355642459");
    matchesTel("020-88524574");
    testPlit1();
    testPlit2();
     replaceTest1() ;
     replaceTest2();
    }
    // 需求:编写一个正则表达式匹配手机号 ,第一位:只能是1开头,第二位:35478 长度:11位
    public static void matchesPhone(String phone) {
        String reg = "1[34578]\\d{9}";
        System.out.println(phone.matches(reg) ? "合法手机号" : "非法手机号");
    }
    // 需求,匹配固定电话 ,区号-主机号 区号:首位是0 长度3~4 主机号: 首位不能是0 长度7~8位
    public static void matchesTel(String tel) {
        System.out.println(tel.matches("0\\d{2,3}-[1-9]\\d{6,7}") ? "合法固话": "非法固话");
    }
    // 根据空格切割
    public static void testPlit1() {
        String str = "明            天   放           假";
        String[] datas = str.split(" +");
        System.out.println("数组的元素" + Arrays.toString(datas));
    }
    
    // 根据重叠词进行切割
    /*
     * 组和捕获 捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
     * 
     * 1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C)
     * 
     * 组零始终代表整个表达式。 注意:从最左边的括号开始计算组
     */
    public static void testPlit2() {
        String str = "大家家家明天天玩得得得得得得得开心";// 大明玩开心
        String[] datas = str.split("(.)\\1+"); // 如果正则内容需要被复用,需要对正则的内容进行分组,分组的目的是为了提高正则的复用性.组号不能指定,组号从1开始
        System.out.println("数组的元素" + Arrays.toString(datas));
    }
    
    // 作业:编写一个正则匹配一个邮箱
    // 替换
    public static void replaceTest1() {
        String str = "联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119联系我:13567012119";
        String reg = "1[34578]\\d{9}";
        str = str.replaceAll(reg, "******");
        System.out.println("替换后的帖子:" + str);
    }
    public static void replaceTest2() {
        String str = "我我我要要要做做做做项项项项项项目目";
        String reg = "(.)\\1+";
        str = str.replaceAll("(.)\\1+", "$1");//如果需要在replaceAll方法正则外部引用组的内容,那么使用"$组号"
        System.out.println("替换后的帖子:" + str);
    }
}


package com.fish.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
查找:
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的正則對象匹配任意的字符串用于创建 Matcher 对象,
依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。 
因此,典型的调用顺序是 
 Pattern p = Pattern.compile("正則");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();
一次匹配:
 boolean b = Pattern.matches("a*b", "aaaaab");
查找需要使用的對象
 1、Pattern(正则对象)
 2、Matcher(匹配对象)
匹配要使用到的方法:
1、find() 通知匹配器去匹配字符串,查找符合规则的字符串,如果能查找到符合规则的字符串,则返回true,否则返回false
2、group() 获取符合规则的子串
注意:使用group方法的时候,一定要先调用find方法让匹配器去查找符合规则的字符串,否则报错
 */
 
public class Demo4 {
    public static void main(String[] args) {
        //想要获取由3个字母组成的单词。
        String str = "da jia zhu yi le,ming tian bu fang jia,xie xie!";
      
        String reg = "\\b[a-zA-Z]{3}\\b";//先要把字符串的正则编译成Pattern对象
        Pattern p = Pattern.compile(reg);//使用正则对象匹配字符串用于 产生一个Matcher对象
        Matcher m = p.matcher(str);
        
        System.out.println("有符合规则的字符串吗?"+m.find()); //一次获取一次
        System.out.println("获取结果"+m.group()); //一次获取一次
        System.out.println("获取结果"+m.group()); //一次获取一次
        
        while(m.find()) 
        {
            //System.out.println(m.start()+"...."+m.end());
            //System.out.println("sub:"+str.substring(m.start(),m.end()));
            System.out.println(m.group());
        }
    
        //System.out.println(m.find());//将规则对字符串进行匹配查找。
        //System.out.println(m.find());//将规则对字符串进行匹配查找。
        //System.out.println(m.group());//在使用group方法之前,必须要先找,找到了才可以取。
    }
}


package com.fish.regex;
/*
边界匹配器 
^ 行的开头 
$ 行的结尾 
\b 单词边界   单词编辑匹配器只是代表了单词的开始或者是结束部分,不匹配任何的字符
\B 非单词边界 
\A 输入的开头 
\G 上一个匹配的结尾 
\Z 输入的结尾,仅用于最后的结束符(如果有的话) 
\z 输入的结尾 
*/
public class Demo5 {
    public static void main(String[] args) {
        System.out.println("hello world".matches("hello\\b world"));
    }
}


package com.fish.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
 网络爬虫(网络蜘蛛):
 */
public class Demo6 {
    // .com .cn .com.cn .net
    public static void main(String[] args) {
       
        String content = "有事没事联系:[email protected] 有事没有联系:[email protected]";
        String reg = "[a-zA-Z1-9]\\w*@[a-zA-Z0-9]{2,}(\\.(com|cn|net)){1,2}";
        // 把字符串的正则编译成正则对象
        Pattern p = Pattern.compile(reg);
        // 使用正则对象产生匹配器对象
        Matcher m = p.matcher(content);
       
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}


本文出自 “小鱼的博客” 博客,谢绝转载!

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

java 正则表达式

java编程基础 正则表达式

java匹配url的正则表达式

java正则表达式怎么书写?

java 正则表达式 ^java 是啥意思

JAVA正则表达式代码