< 笔记 > Java SE

来源:互联网 发布:代挂乐最新源码 编辑:程序博客网 时间:2024/05/29 08:02

10 Java SE 正则表达式

By Kevin Song

概述

作用:操作字符串数据

public class RegexDemo {    public static void main(String[] args) {        String qq = "303043149";        //第一位1到9        //第二位0到9        //第二位0到9出现4到14次        String regex = "[1-9][0-9]{4,14}";//正则表达式        boolean b = qq.matches(regex);        System.out.println(qq+b);    }    public static void checkQQ(String qq) {        int len = qq.length();        if(len>=5 %% len<=15) {            if(!qq.startsWith("0")) {                try {                    long l Long.parseLong(qq);                } catch(NumberFormatException e) {                    System.out.println("非法字符");                }            } else {                System.out.println(qq+":不能0开头");            }        } else {            System.out.println(qq+"长度错误");        }    }}

常见的规则

字符类 含义 [abc] a、b 或 c(简单类) [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) [a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集) [a-z&&[def]] d、e 或 f(交集) [a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去) [a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) 预定义字符类 含义 . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] 边界匹配器 含义 ^ 行的开头 $ 行的结尾 \b 单词边界 \B 非单词边界 \A 输入的开头 \G 上一个匹配的结尾 \Z 输入的结尾,仅用于最后的结束符(如果有的话) \z 输入的结尾 Greedy 数量词 X? X 一次或一次也没有 X* X 零次或多次 X+ X 一次或多次 X{n} X 恰好 n 次 X{n,} X 至少 n 次 X{n,m} 至少 n 次,但是不超过 m 次 Logical 运算符 含义 XY X 后跟 Y X Y (X) X,作为捕获组 Back 引用 含义 \n 任何匹配的 n^th 捕获组

组的概念

((A)(B(C)))
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式

常见功能

正则表达式对字符串的常见操作

  • 匹配
    • 使用String类中的matches方法
  • 切割
    • 使用String类中的split方法
  • 替换
    • 使用String类中的replaceAll方法
  • 获取
    • 将正则表达式封装成对象
      • Pattern p = Pattern.compile(“a*b”);
    • 通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher
      • Matcher m = p.matcher(“aaaaab”);
    • 通过Matcher匹配其对象的方法对字符串进行操作
      • boolean b = m.matches();
public class RegexDemo2 {    public static void main(String[] args) {        functionDemo_4();    }    /*获取    */    public  static void functionDemo_4() {        String str = "da jia hao,ming tian bu fang jia!";        /*        获取三个字母的单词[a-z]{3}        */        String regex = "\\b[a-z]{3}\\b";        //把正则封装成对象        Pattern p = Pattern.compile(regex);        //通过正则对象获取匹配器对象        Matcher m = p.matcher(str);        //使用Matcher对象的方法对字符串进行操作        //要获取三个字母组成的单词,用find()方法        System.out.println(str);        while(m.find()) {            System.out.println(m.group());//获取匹配的子序列            System.out.println(m.start()+":"+m.end());//获取字母开始和结束位置,包头不包尾        }    }    //替换    public static void functionDemo_3() {        String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";        /*        把.用()封装成组(.)        组的编号为\\1        编号为1的组出现过一次或者多次所以(.)\\1+        获取编号1组里的字母并且替换$1        */        str = str.replaceAll("(.)\\1+", "$1");        System.out.println(str);        String tel = "15800001111";//158****1111;        /*        前三个数封装成编号为1的组(\\d{3})        末四个数封装成编号为2的组(\\d{4})        */        tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");        System.out.println(tel);    }    //切割    public static void functionDemo_2(){        String str = "zhangsan    xiaoqiang   zhaoliu";        String[] names = str.split(" +");//一次或多次空格        String str = "zhangsan.xiaoqiang.zhaoliu";        String[] names = str.split("\\.");//用.来切,\\转义        String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";        /*        把.用()封装成组(.)        组的编号为\\1        编号为1的组出现过一次或者多次所以(.)\\1+        */        String[] names = str.split("(.)\\1+");/        for(String name : names){            System.out.println(name);        }    }    //匹配    public static void functionDemo_1(){        //匹配手机号码是否正确        String tel = "15800001111";        /*        第一位固定1        第二位是3,5,8中的一个[358]        第三位开始[0-9]用预定义字符类表示\\d重复9次        */        String regex = "1[358]\\d{9}";        boolean b = tel.matches(regex);        System.out.println(tel+":"+b);    }}

正则表达式练习

练习一

  • 过滤信息
    • We….neeeeeed..baa…aaack……uuu..up
  • ip地址排序
    • 192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55
  • 邮件地址校验
public class RegexTest {    public static void main(String[] args) {        test_1();    }    public static void test_1 {        String str = "We....neeeeeed..baa...aaack......uuu..up";        //去掉...        str = str.replaceAll("\\.+"," ");        //替换叠词        str = str.replaceAall("(.)\\1+","$1");        System.out.println(str);    }    public static void test_2 {        String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";        //为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同        //补零,每一段加2个0        ip_str = ip_str.replaceAll("(\\d+)","00$1");        //00192.168.10.34 00127.0.0.1 003.3.3.3 00105.70.11.55        System.out.println(ip_str);        //每一段保留数字三位        ip_str = ip_str.replaceAll("0*(\\d{3})","$1");        //192.168.10.34 127.0.0.1 003.3.3.3 105.70.11.55        System.out.println(ip_str);        //把ip地址切出        str = str.split(" +");        TreeSet<String> ts = new TreeSet<String>();        for(String ip : ips) {            ts.add(ip);        }        for(String ip : ts) {            //0没有或者多次后跟着连续数字            //用连续的数字替换带0的那部分            System.out.println(ip.replaceAll("0*(\\d+)", "$1"));        }        public static void test_3 {        String mail = "abc@sina.com";        /*        第一部分大小写字母数字下划线都可以一个或者多个[a-zA-Z0-9_]+        第二部分固定@        第三部分大小写字母数字都可以一个或者多个[a-zA-Z0-9]+        第四部分(\\.字母出现1到3次)出现一次或者多次(\\.[a-zA-Z]{1,3})+        */        String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+\\.[a-zA-Z]{1,3})+";        regex = "\\w+@\\w+(\\.\\w+)+";        boolean b = mail.matches(regex);        System.out.println(mail+":"+b);        }    }}

网页爬虫

定义:在互联网中获取符合指定规则数据的程序

public class RegexTest2 {    public static void main(String[] args) throws IOException {        List<String> list = getMailsByWeb();        for(String mail : list){            System.out.println(mail);        }    }    public static List<String> getMailsByWeb() throws IOException {        //1, 读取源文件        //BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));        URL url = new URL("http://192.168.1.100:8080/myweb/mail.html");        BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));        //2,对读取的数据进行规则的匹配,从中获取符合规则的数据        String mail_regex = "\\w+@\\w+(\\.\\w+)+";        List<String> list = new ArrayList<String>();        Pattern p = Pattern.compile(mail_regex);        String line = null;        while((line=bufIn.readLine())!=null){            Matcher m = p.matcher(line);            while(m.find()){                //3,符合规则的数据存储到集合中                list.add(m.group());            }        }        return list;    }    public static List<String>  getMails() throws IOException{        //1, 读取源文件        BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));        //2,对读取的数据进行规则的匹配,从中获取符合规则的数据        String mail_regex = "\\w+@\\w+(\\.\\w+)+";        List<String> list = new ArrayList<String>();        Pattern p = Pattern.compile(mail_regex);        String line = null;        while((line=bufr.readLine())!=null){            Matcher m = p.matcher(line);            while(m.find()){                //3,符合规则的数据存储到集合中                list.add(m.group());            }        }        return list;    }}
原创粉丝点击