Java的正则表达式使用java.util.regex
包,该包主要包括以下三个类:
Pattern类:
pattern对象是一个正则表达式的编译表示。Pattern类没有公共构造方法。要创建一个Pattern对象,必须首先调用其公共静态编译方法,它返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。
Matcher类:
Matcher对象是对输入字符串进行解释和匹配操作的引擎。与Pattern类一样,Matcher也没有公共构造方法。你需要调用Pattern对象的matcher方法来获得一个Matcher对象。
PatternSyntaxException类:
PatternSyntaxException是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
. ^ $ * + ? {} [] \ | () #此处共11个
无元字符:常规匹配
字母和字符的自身匹配。
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
索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:
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
查找方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:
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)
替换方法是替换输入字符串里文本的方法:
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
PatternSyntaxException是一个非强制异常类,它指示一个正则表达式模式中的语法错误。该类提供的方法:
public String getDescription()
获取错误的描述。
public int getIndex()
获取错误的索引。
public String getPattern()
获取错误的正则表达式模式。
public String getMessage()
返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示。