Java

Java 22 正则表达式

2019-02-10  本文已影响0人  第二套广播体操

正则表达式:正确的规则
专门用于对字符串的操作
规则是由符号组成的 用符号操作字符串变得简单
弊端:阅读性降低
所以学习正则就是学习符号的使用
1 匹配
String类中提供了匹配boolean matches(String regex)方法
2 切割
String类中提供了匹配boolean split(String regex)方法
3 替换
String类中提供了匹配boolean replace(String regex)方法
4 获取
创建正则表达式对象进行操作java.util.regex.Pattern


Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

获取方法
Matcher方法

PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。


捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。

例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。

捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:

((A)(B(C)))
(A)
(B(C))
(C)
可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。

还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。


四个String中的正则表达式功能练习

public class Regex_Test1 {
    public static void main(String[] args) {
//        matchesDemo(); 匹配
//        splitDemo(); 分割
//        replace(); 替换
//        getDemo(); 获取
    }

    private static void getDemo() {
//        实现获取将符合规则的取出来
//        用到正则表达式对象 java.util.regex.Pattern
//        1.将字符串规则封装成Pattern对象 compile(regex);
//        2.通过正则对象匹配器对象,用对将正则规则 作用到要操作的字符串上
//        3.通过匹配器对象的方法,对字符串进行操作


//        获取字符串中符合规则的内容
        String temp="da jia zhu yi li , ming tian fang jia le";
//        取出由三个字母组成的单词 添加边界
        String regex="\\b[a-zA-Z]{3}\\b";
//        1.将规则编译成对象
        Pattern p=Pattern.compile(regex);
//        2.和字符串关联,获取匹配器对象
        Matcher m=p.matcher(temp);
        while (m.find())
            System.out.println(m.group()+"字符长度位置"+m.start()+"-"+m.end());
    }

    private static void replace() {
        String tel="15800000011";
        String string=tel.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
//        $可以在多参数时 ,后面的参数 可以通过变换的形式取到前一个参数的组
        System.out.println(string);
    }

    private static void splitDemo() {
//        String temp="zhangsan      lisi       wangwu";
//        String regex=" +";
//        String temp="zhangsan.lisi.wangwu";
//       因为java正则表达式中.为任意字符 所以要转换成普通的点
//        String regex="\\.";
//     两个反斜杠转义
        String temp="qwe##qweqweeeeeeeasdwezzzz1ewe";
        String regex="(.)\\1+";
//        为了实现规则的复用,用()将需要复用的规则封装
//        就称为了正则表达式中的组 每个组都有编号 从1开始
//        通过使用编号就可以复用该对象组的规则内容 注意:编号必须用到组的后面 先封装 再调用
        String[] names=temp.split(regex);
        for (String name :
                names) {
            System.out.println("+++"+name+"----");
        }
    }

    private static void matchesDemo() {
//        需求 :校验手机号码是否正确
        String tel="15800000011";
        String regex="1[358][0-9]{9}";
//        正则表达式规则
        boolean b=tel.matches(regex);
        System.out.println(tel+b);
    }
}

Test

public class Test1 {
    public static void main(String[] args) {
        /*
        * 我我我.......我要....学学.....编程.....程
        * 还原我要学编程*/
        test_1();
    }

    private static void test_1() {
        String temp="我我我.......我要....学学.....编程.....程";
        /*
        * 1,四个功能选择 替换
        * 2,将..去掉
        * 3,叠词干掉*/
        temp=temp.replaceAll("\\.+","");
        temp=temp.replaceAll("(.)\\1+","$1");
        System.out.println(temp);

    }
}
public class Test2 {
    public static void main(String[] args) {
        //对IP地址进行排序 192.168.1.200 10.10.10.10   3.3.50.3 127.0.0.1
        test2();
    }

    private static void test2() {
        /*排序出现问题 是按照字符串字典顺序排的序
        * 问题在哪呢 是因为每一个地址段的位数不对
        * 如果位数都是三位就可以了 只有补0
        * 每一段位数都不同 都补两个 取后三位*/
        String temp="192.168.1.200 17.10.10.10   3.3.50.3 127.0.0.1";
//        补两个零
        temp=temp.replaceAll("(\\d+)","00$1");
//        取后三位
        temp=temp.replaceAll("0*(\\d{3})","$1");
        String[] strings=temp.split(" +");
        Arrays.sort(strings);

        for (String s :
                strings) {
            System.out.println(s.replaceAll("0*(\\d+)","$1"));
        }
    }
}
public class Test3 {
    public static void main(String[] args) {
//        校验邮箱地址
        test3();
    }

    private static void test3() {
        String temp="319501967@qq.com.cn";
       boolean b= temp.matches("\\w+@[a-zA-Z0-9]+(\\.[A-Za-z]{2,3}){1,3}");
        System.out.println(b);
    }
//    从网上找 都有
}
//做一个邮箱爬虫
/*1.需要一个页面
  2.需要用到IO技术  纯文本 用FileReader();
  3.需要正则表达式对象
  4.用集合装爬出来的邮箱

* */
public class Test4 {
    public static void main(String[] args) throws IOException {
        List<String> list=new ArrayList<>();
        getEmail(list);
      showEmail(list);
    }

    private static void getEmail(List<String> list) throws IOException {
        File file=new File("D:\\IO\\本地邮箱.txt");
        String regex="\\w+@[a-zA-Z0-9]+(\\.[A-Za-z]{2,3}){1,3}";
        Pattern p=Pattern.compile(regex);
//        创建pattern 对象是一个正则表达式的编译表示

        BufferedReader reader=new BufferedReader(new FileReader(file));
        String info=null;
        while ((info=reader.readLine())!=null)
        {
           Matcher m= p.matcher(info);
//           对获取到的一行数据 放到matcher对象中进行解释和匹配
           while (m.find())
           {list.add(m.group());}
        }
            reader.close();
    }

    private static void showEmail(List<String> list) {
        for (Iterator<String> iterator = list.iterator(); iterator.hasNext(); ) {
            String next = iterator.next();
            System.out.println(next);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读