一,正则表达式语法
1.点号
点号(.)可以匹配除"\n"之外的任何单个字符.例如,正则表达式"t.n"可匹配"tan","ten",'tcn',"t=n","t n"等.
2.中括号
可以在中括号([])内指定需要匹配的若干字符,表示仅使用这些字符参与匹配。例如,正则表达式"t[abcd]n"只匹配"tan"、"tbn"、"ten"、"tdn"。中括号还有一些特殊写法,用于匹配某一范围内的字符,例如"[a-z]"匹配一个小写字母,‘‘[a−zA−Z]′"匹配一个字母,"[0-9]"匹配一个数字字符,"[a-z0-9]"匹配一个小写字母或一个数字字符。
3.竖线
竖线(|)可以匹配其左侧或右侧的符号。例如,正则表达式"t(a|e|i|io)n"除了"tan"。"ten"和"tin"外,还可以匹配"tion"。使用竖线时,必须使用小括号将可以匹配的字符括起来,小括号用来标记正则表达式中的组(group)。
4.^符号
^符号可以匹配一行的开始。例如,正则表达式"^Spring.*"匹配"Spring MVC",而不匹配”a Spring MVC"。若^符号在中括号内,则表示不需要参与匹配的字符。例如,正则表达式"[a-z&&[^bc]]"表示匹配除b 和c之外的小写字母,等价于"[ad-z]";正则表达式"[a-z&&[^h-n]]"表示匹配除h 到n之外的小写字母,等价于"[a-go-z]";正则表达式"[^b][a-z]+"表示首个字符不能是b且后跟至少一个小写字母。
5.美元符号
美元符号($)可以匹配一行的结束。例如,正则表达式".*App$"中的$表示匹配以App结尾的字符串,可以匹配"Android App",而不匹配"iOS Apps"和"App."。
6.反斜线
反斜线(\)表示其后的字符是普通字符而非元字符。例如,正则表达式"\$"用来匹配$字符而非结束,"\."用来匹配"."字符而非任一字符。
7.匹配次数元字符
匹配次数元字符用来确定其左侧符号的数显次数.
元字符 | 含义 |
X* | 匹配X出现零次或多次,如Y,YXXXY |
X+ | 匹配X出现一次或多次,如YXY,YXX |
X? | 匹配X出现零次或一次,如Y,YXY |
X{n} | 匹配X出现恰好n次 |
X{n,} | 匹配X出现至少n次 |
X{n,m} | n<=m,匹配X出现至少n次,最多m次 |
8.其他常用符号
元字符 | 含义 |
\d | 数字,相当于[0-9] |
\D | 非数字,相当于[^0-9] |
\s | 空白符,相当于[\t\n\x0B\f\r] |
\S | 非空白符,相当于[^\s] |
\w | 单词字符,相当于[a-zA-Z_0-9] |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
正则表达式 | 描述 |
---|---|
this is text | 匹配字符串 "this is text" |
this\s+is\s+text | 注意字符串中的 \s+。 匹配单词 "this" 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,再之后 \s+ 匹配多个空格然后再跟上 text 字符串。 可以匹配这个实例:this is text |
^\d+(\.\d+)? | ^ 定义了以什么开始 \d+ 匹配一个或多个数字 ? 设置括号内的选项是可选的 \. 匹配 "." 可以匹配的实例:"5", "1.5" 和 "2.21"。 |
二,java.util.regex 包
java.util.regex 包是 Java 标准库中用于支持正则表达式操作的包。
java.util.regex 包主要包括以下三个类:
- Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
- Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
- PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
以下实例中使用了正则表达式 .*runoob.* 用于查找字符串中是否包了 runoob 子串:
import java .util.regex.*;
class Main{
public static void main(String[] args) {
String content="I am noob from runoob.com";
String pattern=".*runoob.*";
boolean isMatch=Pattern.matches(pattern,content);
System.out.println("字符串中是否包含了'runoob'子字符串?"+isMatch);
}
}
1.Pattern类与Matcher类
(1)Pattern类
Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式.Pattern类的构造方法是私有的,不可以直接创建正则表达式,为此,Pattern类提供了一个静态的compile()方法,通过调用compile()方法可以创建一个正则表达式.
Pattern p=Pattern.compile("\\w+");
方法声明 | 功能描述 |
static Pattern compile(String re) | 将正则表达式编译为模式 |
Matcher matcher(CharSequence input) | 根据模式为字符串input创建匹配器.String类实现了CharSequence接口,CharSequence接口可视为String |
Static boolean matches(String regex,CharSequence input) | 判断字符串input是否匹配正则表达式regex.该方法适用于只进行一次匹配的情况 |
String pattern() | 返回模式使用的正则表达式 |
String[] spil(CharSequence input) | 根据模式将字符串input分割为字符串数组 |
String[] spil(CharSequence input,int limit) | 根据模式将字符串input分割为字符串数组,同时指定子串的最大个数为limit |
import java .util.regex.*;
class Main{
public static void main(String[] args) {
Pattern p1=Pattern.compile("a*b");
Matcher m1=p1.matcher("aaaaab");
Matcher m2=p1.matcher("aaabbb");
System.out.println(m1.matches());
System.out.println(m2.matches());
Pattern p2=Pattern.compile("[/]+");
String[] str=p2.split("zhaangsan//lisi//wangwu//zhaoliu//xiaoqi");
for(String s:str){
System.out.print(s+"\t");
}
}
}
(2)Matcher类
Matcher类用于验证Pattern类定义的模式与字符串是否匹配,因此Matcher实例也称为匹配器.Matcher类的构造方法也是私有的,不能直接创建Matcher实例,只能通过Pattern.matcher()方法获取该类的实例,多个Matcher对象可以使用同一Pattern对象.
方法声明 | 功能描述 |
Pattern pattern() | 返回匹配器的模式 |
Matcher usePattern(Pattern p) | 使用模式为 p的匹配器 |
Matcher reset() | 重设匹配器到初始状态 |
Matcher reset(CharSequence input) | 重设匹配器到初始状态,并以 input为目标字符串 |
boolean find() | 在目标字符串中查找下一个匹配字符串,若找到则返回true |
int start() | 求正则表达式匹配的字符串在整个字符串中第一次出现的索引 |
int end() | 求正则表达式匹配的字符串在整个字符串中最后一次出现的索引 |
String group() | 返回匹配的子串 |
String group(int i) | 返回上一次匹配的子串中与第i组匹配的子串。正则表达式中以 一对小括号括起来的部分称为组 |
boolean matcher() | 对整个字符串进行匹配,只有整个字符串都匹配才返回true |
boolean lookingAt() | 从目标字符串的第一个字符开始匹配,若匹配成功则返回 true |
String replaceAll(String s) | 将目标字符串中与模式匹配的全部子串替换为s并返回替换后的 字符串 |
String replaceFirst(String s) | 将目标字符串中与模式匹配的首个子串替换为 s 并返回替换后的 字符串 |
import java .util.regex.*;
class Main{
public static void main(String[] args) {
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
System.out.println("字符串是否匹配:"+m.matches());
Matcher m2=p.matcher("2223");
System.out.println("字符串2223与模式p是否匹配:"+m2.matches());
System.out.println("字符串22bb23与模式p的匹配结果:"+m.lookingAt());
Matcher m3=p.matcher("aa2223");
System.out.println("字符串aa2223与模式p的匹配结果:"+m3.lookingAt());
System.out.println("字符串22bb23与模式p是否存在下一个匹配结果:"+m.find());
System.out.println("字符串aa2223与模式p是否存在下一个匹配结果:"+m3.find());
Matcher m4=p.matcher("aabb");
System.out.println("字符串aabb与模式p是否存在下一个匹配结果:"+m4.find());
Matcher m1=p.matcher("aaa2223bb");
m1.find();
System.out.println("模式p与字符串aaa2223bb第一次匹配的索引:"+m1.start());
System.out.println("模式p与字符串aaa2223bb最后一次匹配的索引:"+m1.end());
System.out.println("模式p与字符串aaa2223bb匹配的子字符串:"+m1.group());
Pattern p2=Pattern.compile("[/]+");
Matcher m5=p2.matcher("张三//李四//王五//小三");
System.out.println("将字符串张三//李四//王五//小三中的/全部替换为|:"+m5.replaceAll("|"));
System.out.println("将字符串张三//李四//王五//小三中的首个/替换为|:"+m5.replaceFirst("|"));
}
}
2.String类对正则表达式的支持
方法声明 | 功能描述 |
boolean matches(String regex) | 匹配字符串regex |
String greplaceAll(String regex,String replacement) | 使用字符串replacement替换regex |
String[] spilt(String regex) | 拆分字符串regex |
import java .util.regex.*;
class Main{
public static void main(String[] args) {
String str="A1B22DDS23DSJ9D".replaceAll("\\d+","_");
System.out.println("字符串替换后为:"+str);
boolean te="321111asl".matches("\\d+");
System.out.println("字符串是否匹配:"+te);
String[] s="SSs25sd55sd2ss23s2652sd".split("\\d+");
System.out.println("字符串拆分后为:");
for(String s1:s){
System.out.print(s1+"\t");
}
}
}
/*
字符串替换后为:A_B_DDS_DSJ_D
字符串是否匹配:false
字符串拆分后为:
SSs sd sd ss s sd
*/