Java开发--9--正则表达式

1、Java正则表达式

Java的正则表达式使用java.util.regex包,该包主要包括以下三个类:

Pattern类:

pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,必须首先调用其公共静态编译方法,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。

Matcher类:

Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象。

PatternSyntaxException类:

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

2、正则表达式语法

2.1 元字符

.  ^  $  *  +  ?  {}  []  \  |  ()          #此处共11个

2.2 元字符释义

无元字符:常规匹配
字母和字符的自身匹配。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "top tip tup typ ttp trp tep twp tqp";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("tip");
//      等价语句
//      String pattern = "tip";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
tip

元字符:^
匹配行首。字符串的开始

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "top tip tup typ ttp trp tep twp tqp";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("^top");
//      等价语句
//      String pattern = "^top";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
top (如果首字符不是top,则什么都不输出)

元字符:$
匹配行尾。行尾:字符串尾或者换行字符后面的任何位置

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "top tip tup typ ttp trp tep twp tqp";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("tqp$");
//      等价语句
//      String pattern = "tqp$";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
tqp (如果尾字符不是tqp,则什么都不输出)

元字符:*
零次或多次匹配前面的字符或子表达式。等效于{0,}

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "abbbbbccccc";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("ab*");
//      等价语句
//      String pattern = "ab*";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
abbbbb (如果a后面不是b,则只输出a)

元字符:+
一次或多次匹配前面的字符或子表达式。等效于{1,}

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "abbbbbccccc";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("ab+");
//      等价语句
//      String pattern = "ab+";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
abbbbb (如果a后面不是b,则什么都不输出)

元字符:?
零次或一次匹配前面的字符或子表达式。等效于{0,1}

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "abbbbbccccc";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("ab?");
//      等价语句
//      String pattern = "ab?";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
ab (如果a后面不是b,则只输出a)

元字符:{m,n}
m、n是十进制整数。至少有m个重复,至多有n个重复
忽略m会认为下边界为0。忽略n会认为上边界是无穷大
{0,}等同于*。{1,}等同于+。{0,1}等同于?

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "abbbbbccccc";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("b{1,4}");
//      等价语句
//      String pattern = "b{1,4}";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
bbbb
b 
(解释:一共5个b,最长4个b,最短1个b)
(如果正则是:b{
     2,4},则只输出4个b,因为剩下的1个b不满足最短2个b的要求)

元字符:[]
字符集,匹配包含的任一字符

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "top tip tup typ ttp trp tep twp tqp";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("t[iuy]p");
//      等价语句
//      String pattern = "t[iuy]p";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
tip
tup
typ

如果正则是(即一边无数据):t[iuy],则输出:
ti
tu
ty

元字符:\
1、用于转义元字符,使其普通化。

2、后面加不同字符可以表示不同特殊意义。如下:

\\b:匹配一个字边界,即要匹配字符一边如果有空格则匹配。
\\B:非字边界匹配,即要匹配字符两边都有字符则匹配(没有空格)。
\\d:匹配任何十进制数字。相当于:[0-9]
\\D:匹配任何非数字字符。相当于:[^0-9]
\\s:匹配任何空白字符。相当于:[\t\n\r\f\v]
\\S:匹配任何非空白字符。相当于:[^\t\n\r\f\v]
\\w:匹配任何字母数字字符。相当于:[a-zA-Z0-9_]
\\W:匹配任何非字母数字字符。相当于:[^a-zA-Z0-9_]

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "112233aabbcc";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("\\D");
//      等价语句
//      String pattern = "\\D";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
a
a
b
b
c
c

元字符:|
x|y 匹配x或y

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line = "top tip tup typ ttp trp tep twp tqp";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("t(u|i)p");
//      等价语句
//      String pattern = "t(u|i)p";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            // 正则遍历原始字符串
            String sub = line.substring(m.start(), m.end());
            // 遍历匹配到就输出
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
tip
tup

元字符:()
分组,括号里优先

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

    // 按指定模式在字符串查找

        // 原始待匹配字符串
        String line =
                "shudh shi hello src=baidu yes sdi\n" +
                "dhhdih src=google yes idsj\n" +
                "ihsad asihd src=234 yes asi\n" +
                "asij hello src=Alibaba yes asi\n";
        // 创建Pattern对象(即编译正则表达式)
        Pattern r = Pattern.compile("hello src=(.+) yes");
//      等价语句
//      String pattern = "hello src=(.+) yes";
//      Pattern r = Pattern.compile(pattern);
        // 创建matcher对象(对输入字符串进行正则匹配的引擎)
        Matcher m = r.matcher(line);   // m不可打印输出

    // 在原始字符串中匹配及输出

        // 正则匹配
        while (m.find()) {
     
            System.out.println(m.group(1));
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
baidu
Alibaba 

如果输出是m.group(0),则输出:
hello src=baidu yes
hello src=Alibaba yes

3、Matcher类的方法

3.1 索引方法

索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:

public int start()
返回以前匹配的初始索引

public int start(int group)
返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引

public int end()
返回最后匹配字符之后的偏移量

public int end(int group)
返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量

代码实例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    public static void main(String[] args) {
     

        String line = "112233aabbcc";
        Pattern r = Pattern.compile("\\d");
        Matcher m = r.matcher(line);
        //find()方法
        while (m.find()) {
     
            // start()方法和end()方法
            String sub = line.substring(m.start(),m.end());
            System.out.println(sub);
        }
    }
}

-----------------------------------------------------------------
输出结果如下:
1
1
2
2
3
3

3.2 查找方法

查找方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:

public boolean lookingAt()
尝试将从区域开头开始的输入序列与该模式匹配

public boolean find()
尝试查找与该模式匹配的输入序列的下一个子序列

public boolean find(int start)
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列

public boolean matches()
尝试将整个区域与模式匹配

代码实例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    private static final String REGEX = "abb";
    private static final String INPUT = "abbbbbb";
    private static Pattern pattern;
    private static Matcher matcher;

    public static void main( String args[] ){
     
        pattern = Pattern.compile(REGEX);
        matcher = pattern.matcher(INPUT);

        System.out.println(REGEX);
        System.out.println(INPUT);
        //lookingAt()方法。匹配中就输出true
        System.out.println("lookingAt(): "+matcher.lookingAt());
        //matches()方法。如果恰好完全匹配中所有字符,才输出true
        System.out.println("matches(): "+matcher.matches());
    }
}

-----------------------------------------------------------------
输出结果如下:
abb
abbbccc
lookingAt(): true
matches(): false (如果正则写成abb+,此处结果为true)

3.3 替换方法

替换方法是替换输入字符串里文本的方法:

public Matcher appendReplacement(StringBuffer sb, String replacement)
实现非终端添加和替换步骤

public StringBuffer appendTail(StringBuffer sb)
实现终端添加和替换步骤

public String replaceAll(String replacement)
替换模式与给定替换字符串相匹配的输入序列的每个子序列

public String replaceFirst(String replacement)
替换模式与给定替换字符串匹配的输入序列的第一个子序列

public static String quoteReplacement(String s)
返回指定字符串的字面替换字符串。这个方法返回一个字符串
就像传递给Matcher类的appendReplacement方法一个字面字符串一样工作

代码实例:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
     
    private static String REGEX = "c+";
    private static String INPUT = "aaabbb ccc dddeee";
    private static String REPLACE = "666";

    public static void main(String[] args) {
     
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);
        // replaceAll()方法
        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

-----------------------------------------------------------------
输出结果如下:
aaabbb 666 dddeee

4、PatternSyntaxException类的方法

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

public String getDescription()
获取错误的描述。

public int getIndex()
获取错误的索引。

public String getPattern()
获取错误的正则表达式模式。

public String getMessage()
返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示。

你可能感兴趣的:(Java开发)