正则表达式
正则表达式:正则表达式是一个强大的字符串处理工具(是一个用于匹配字符串的模板),可以对字符串进行查找、提取、分割、替换等操作。
引入正则表达式
例:检验QQ号码的合法性
- 未使用正则表达式
public class Demo01 {
public static void main(String[] args) {
/*校验QQ号码的合法性.
1:必须是5-12位数字
2:不能以0开头
3:必须都是数字*/
String QQ = "10001";
//长度必须是5-12位
if (QQ.length() >= 5 && QQ.length() <= 12) {
//不能以0开头
if (!QQ.startsWith("0")) {
//必须都是数字
for (int i = 0; i < QQ.length(); i++) {
char ch = QQ.charAt(i);
if (!(ch >= '0' && ch <= '9')) {
System.out.println("不合法字符:" + ch);
}
}
} else {
System.out.println("QQ号不能以0开头");
}
} else {
System.out.println("QQ号码长度不正确");
}
}
}
- 使用正则表达式
public class RegexDemo01 {
public static void main(String[] args) {
String QQ="10001";
String regex="[1-9]\d{4,11}";
boolean b = QQ.matches(regex);//返回的是一个boolean值
System.out.println(b);//true
}
}
正则表达式的构造摘要
- 字符类
字符 | 说明 |
---|---|
[abc] |
a 、b 或 c |
[^abc] |
任何字符,除了 a 、b 或 c (否定) |
[a-zA-Z] |
a 到 z 或 A 到 Z ,两头的字母包括在内(范围) |
[a-d[m-p]] |
a 到 d 或 m 到 p :[a-dm-p] (并集) |
[a-z&&[def]] |
d 、e 或 f (交集) |
[a-z&&[^bc]] |
a 到 z ,除了 b 和 c :[ad-z] (减去) |
[a-z&&[^m-p]] |
a 到 z ,而非 m 到 p :[a-lq-z] (减去) |
- 预定义字符类
预定义字符 | 说明 |
---|---|
. |
任何字符 |
d |
数字:[0-9] |
D |
非数字: [^0-9] |
s |
空白字符:[
x0Bf
] |
S |
非空白字符:[^s] |
w |
单词字符:[a-zA-Z_0-9] (一般用于匹配用户名) |
W |
非单词字符:[^w] |
- Greedy 数量词
Greedy 数量词 | 说明 |
---|---|
X? |
X,一次或一次也没有 |
X* |
X,零次或多次(只能含有X或者为空) |
X+ |
X,一次或多次 |
X{ n} |
X,恰好 n 次 |
X{ n,} |
X,至少 n 次 |
X{ n, m} |
X,至少 n 次,但是不超过 m 次 |
PS: 在Java中要多写 (
---
\b
) 表转义
使用正则表达式
Pattern类和Matcher类
Pattern类:Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)
简单工厂方法创建一个正则表达式,。
Matcher类:Matcher类是一个对字符序列执行各种匹配操作的引擎。Matcher对象是通过调用Pattern对象的方法matcher( )
生成的。
Pattern对象是正则表达式编译后再内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,在利用该Pattern对象调用matcher()
方法创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可以共享同一个Pattern对象。
典型的调用顺序是 :
//将一个字符串编译成Pattern对象 Pattern p = Pattern.compile("a*b"); //使用Pattern对象创建Matcher对象 Matcher m = p.matcher("aaaaab"); boolean b = m.matches();//返回true
上面所定义的Pattern对象可以多次重复使用,若某一个正则表达式只需用一次,则可以直接使用Pattern类的静态方法matches()
boolean b=Pattern.matches("a*b","aaaaab");//返回true
Matcher类常用方法
find()
返回目标字符串中是否包含与Pattern匹配的子串
group()
返回与Pattern匹配的子串
例:提取字符串中所有的字母
public class MatcherTest {
public static void main(String[] args) {
String s="abc,Abc,12]w,?s2a,ab_c,<ab<c";
Matcher m=Pattern.compile("[a-zA-Z]").matcher(s);
while(m.find()){
System.out.print(m.group());
}
}
}
输出结果:abcAbcwsaabcabc
正则表达式的分割方法
public String[] split(String regex)
返回为字符串数组
public class Split {
public static void main(String[] args) {
String s = "AA-CC-BB-DD-QQ";
String[] arr = s.split("-");
for(String str : arr){
System.out.println(str);
}
}
}
AA
CC
BB
DD
QQ
PS:如果按"."
分割的话,因为"."
表示任何字符,所以注意添加转义字符"\."
正则表达式的替换方法
public String replaceAll(String regex,String replacement)
public class ReplaceAll {
public static void main(String[] args) {
String s = "I LOVE U";
//把"U"都改成"YOU"
s = s.replaceAll("U", "YOU");
System.out.println(s);
}
}
I LOVE YOU