一文教会你如何在Java中使用正则表达式(二)

简介: 正则表达式一般用于字符串匹配, 字符串查找和字符串替换. 别小看它的作用, 在工作学习中灵活运用正则表达式处理字符串能够大幅度提高效率, 编程的快乐来得就是这么简单。一下子给出一堆匹配的规则可能会让人恐惧, 下面将由浅入深讲解正则表达式的使用。

边界处理

^在中括号内表示取反的意思[^], 如果不在中括号里则表示字符串的开头

public class Demo6 {
    private static void p(Object o){
        System.out.println(o);
    }
    public static void main(String[] args) {
        /**
         * ^  The beginning of a line 一个字符串的开始
         * $  The end of a line       字符串的结束
         * \b A word boundary         一个单词的边界, 可以是空格, 换行符等
         */
        p("hello sir".matches("^h.*"));
        p("hello sir".matches(".*r$"));
        p("hello sir".matches("^h[a-z]{1,3}o\\b.*"));
        p("hellosir".matches("^h[a-z]{1,3}o\\b.*"));
    }
}

练习:匹配空白行合email地址

拿到一篇文章, 如何判断里面有多少个空白行? 用正则表达式能方便地进行匹配, 注意空白行中可能包括空格, 制表符等。

p(" \n".matches("^[\\s&&[^\n]]*\\n$"));

解释: ^[\\s&&[^\n]]*是空格符号但不是换行符, \\n$最后以换行符结束

下面是匹配邮箱:

p("liuyj24@126.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));

解释: [\\w[.-]]+以一个或多个数字字母下划线.-组成, @接着是个@符号, 然后同样是[\\w[.-]]+, 接着\\.匹配., 最后同样是[\\w]+

Matcher类的matches(),find()lookingAt()

matches()方法会将整个字符串与模板进行匹配.

find()则是从当前位置开始进行匹配, 如果传入字符串后首先进行find(), 那么当前位置就是字符串的开头, 对当前位置的具体分析可以看下面的代码示例

lookingAt()方法会从字符串的开头进行匹配.

public class Demo8 {
    private static void p(Object o){
        System.out.println(o);
    }
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("\\d{3,5}");
        String s = "123-34345-234-00";
        Matcher m = pattern.matcher(s);
        //先演示matches(), 与整个字符串匹配.
        p(m.matches());
        //结果为false, 显然要匹配3~5个数字会在-处匹配失败
        //然后演示find(), 先使用reset()方法把当前位置设置为字符串的开头
        m.reset();
        p(m.find());//true 匹配123成功
        p(m.find());//true 匹配34345成功
        p(m.find());//true 匹配234成功
        p(m.find());//false 匹配00失败
        //下面我们演示不在matches()使用reset(), 看看当前位置的变化
        m.reset();//先重置
        p(m.matches());//false 匹配整个字符串失败, 当前位置来到-
        p(m.find());// true 匹配34345成功
        p(m.find());// true 匹配234成功
        p(m.find());// false 匹配00始边
        p(m.find());// false 没有东西匹配, 失败
        //演示lookingAt(), 从头开始找
        p(m.lookingAt());//true 找到123, 成功
    }
}

Matcher类中的start()end()

如果一次匹配成功的话start()用于返回匹配开始的位置, end()用于返回匹配结束字符的后面一个位置

public class Demo9 {
    private static void p(Object o){
        System.out.println(o);
    }
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("\\d{3,5}");
        String s = "123-34345-234-00";
        Matcher m = pattern.matcher(s);
        p(m.find());//true 匹配123成功
        p("start: " + m.start() + " - end:" + m.end());
        p(m.find());//true 匹配34345成功
        p("start: " + m.start() + " - end:" + m.end());
        p(m.find());//true 匹配234成功
        p("start: " + m.start() + " - end:" + m.end());
        p(m.find());//false 匹配00失败
        try {
            p("start: " + m.start() + " - end:" + m.end());
        }catch (Exception e){
            System.out.println("报错了...");
        }
        p(m.lookingAt());
        p("start: " + m.start() + " - end:" + m.end());
    }
}
//输出结果
true
start: 0 - end:3
true
start: 4 - end:9
true
start: 10 - end:13
false
报错了...
true
start: 0 - end:3

替换字符串

想要替换字符串首先要找到被替换的字符串, 这里要新介绍Matcher类中的一个方法group(), 它能返回匹配到的字符串.

下面我们看一个例子, 把字符串中的java转换为大写.

public class Demo10 {
    private static void p(Object o){
        System.out.println(o);
    }
    public static void main(String[] args) {
        Pattern p = Pattern.compile("java");
        Matcher m = p.matcher("java Java JAVA JAva I love Java and you");
        p(m.replaceAll("JAVA"));//replaceAll()方法会替换所有匹配到的字符串
    }
}
//输出结果
JAVA Java JAVA JAva I love Java and you

升级: 不区分大小写查找并替换字符串

为了在匹配的时候不区分大小写, 我们要在创建模板模板时指定大小写不敏感

public static void main(String[] args) {
    Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);//指定为大小写不敏感的
    Matcher m = p.matcher("java Java JAVA JAva I love Java and you");
    p(m.replaceAll("JAVA"));
}
//输出结果
JAVA JAVA JAVA JAVA I love JAVA and you

再升级: 不区分大小写, 替换查找到的指定字符串

这里演示把查找到第奇数个字符串转换为大写, 第偶数个转换为小写

这里会引入Matcher类中一个强大的方法appendReplacement(StringBuffer sb, String replacement), 它需要传入一个StringBuffer进行字符串拼接.

public static void main(String[] args) {
    Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher("java Java JAVA JAva I love Java and you ?");
    StringBuffer sb = new StringBuffer();
    int index = 1;
    while(m.find()){
        //m.appendReplacement(sb, (index++ & 1) == 0 ? "java" : "JAVA"); 较为简洁的写法
        if((index & 1) == 0){//偶数
            m.appendReplacement(sb, "java");
        }else{
            m.appendReplacement(sb, "JAVA");
        }
        index++;
    }
    m.appendTail(sb);//把剩余的字符串加入
    p(sb);
}
//输出结果
JAVA java JAVA java I love JAVA and you ?


相关文章
|
1月前
|
Java 程序员
Java 异常处理与正则表达式详解,实例演练及最佳实践
在 Java 代码执行期间,可能会发生各种错误,包括程序员编码错误、用户输入错误以及其他不可预料的状况。 当错误发生时,Java 通常会停止并生成错误消息,这个过程称为抛出异常。 try...catch 语句 try 语句允许您定义一段代码块,并在其中测试是否发生错误。 catch 语句允许您定义一段代码块,当 try 块中发生错误时执行该代码块。 try 和 catch 关键字成对使用,语法如下:
42 0
|
4月前
|
数据采集 Java 数据格式
【Java】正则表达式,校验数据格式的合法性。
【Java】正则表达式,校验数据格式的合法性。
59 0
|
17天前
|
XML 数据可视化 前端开发
java正则表达式
java正则表达式
C4.
|
1月前
|
Java 程序员
Java的正则表达式
Java的正则表达式
C4.
14 0
|
1月前
|
数据采集 Java
JAVA正则表达式
JAVA正则表达式
14 1
|
1月前
|
Java
Java的正则表达式结构
Java的正则表达式结构
9 0
|
1月前
|
机器学习/深度学习 Java 索引
39、一篇文章弄懂 Java 正则表达式中的量词、贪婪、勉强、独占和 String 的 matches 方法的底层【个人感觉非常值得学习】
39、一篇文章弄懂 Java 正则表达式中的量词、贪婪、勉强、独占和 String 的 matches 方法的底层【个人感觉非常值得学习】
30 0
|
1月前
|
Java
38、Java 中的正则表达式(单字符匹配和预定义字符)
38、Java 中的正则表达式(单字符匹配和预定义字符)
18 0
|
4月前
|
Java 计算机视觉
【Java 正则表达式】简单用法,注意点,我学不会正则
【Java 正则表达式】简单用法,注意点,我学不会正则
|
4月前
|
Java
Java正则表达式【详解】
Java正则表达式【详解】
39 1