正则表达式:
是用字符串描述的一个匹配规则,使用正则表达式可以快速判断给定的字符串是否符合匹配规则。(java.util.regex)使用str.matches(String re1),返回值为boolean类型。
转义字符:
正则表达式在Java中是一个字符串,因此,在表达“\”时,需要用到“\\”。
在正则表达式中,表示一个特殊字符需要用到转义字符“\”。例“&”在正则表达式中为“&”。Java中的正则表达式为“\&”。
匹配任意字符
在Java中,正则表达式用“.”表示任意字符,例如“a.b”可以表示“acb”或“a%b”等等。
匹配数字
匹配数字可以用到“\d”,例如“00\d”正则表达式可以匹配:
“007”或“008”。但注意,正则表达式在Java中的“\”要用“\\”。
匹配常用字符
“\w”可以匹配一个字母、下划线、数字。
匹配空格
“\s”可以匹配空格和Tab(Java中表示为“\t”)。
匹配非**
匹配非数字:“\D”
匹配非常用字符:“\W”
匹配非**:“\*”
重复匹配
“00\d”可以匹配“007”,但“0077”怎样匹配?
可以用修饰符“*”,表示任意个或0个字符。
可以用修饰符“+”,表示最少一个字符。
可以用修饰符“?”,表示一个或0个字符。
可以用修饰符“{n}”,表示n个字符。
可以用修饰符“{n,m}”,表示n~m个字符。
可以用修饰符“{n,}”,表示至少匹配n个字符。
匹配开头和结尾
用^表示开头,$表示结尾:例如,“^A\d{3}$”,可以匹配"A001"、“A380”。
匹配指定范围:
匹配1~9的数:[123456789]或[1-9]
匹配a~y的字母:[a-y]
匹配1~9的数或a~y的字母:[1-9a-y]
不匹配包括1~9的数:[^1-9]
或匹配
使用“|”字符,AB|CD
表示可以匹配AB
或CD
括号匹配(匹配字符串)
(java|php|go)可以匹配java、php或go。
括号匹配的是几组字符串。
匹配分组
使用()可以将正则表达式分组,并提取。
例:\d{3,4}\-\d{6,8}
将其变为(\d{3,4})\-(\d{6,8})
,可以引入java.util.regex包,的Pattern对象匹配,首先创建其正则表达式为Pattern类型,使用Pattern的matcher()方法,获得Matcher对象,匹配成功用group(index)返回子串。
public class Main {
public static void main(String[] args) {
Pattern p = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");
Matcher m = p.matcher("010-12345678");
if (m.matches()) {
String g0 = m.group(0);//010-123456789
String g1 = m.group(1);//010
String g2 = m.group(2);//123456789
System.out.println(g0);
System.out.println(g1);
System.out.println(g2);
} else {
System.out.println("匹配失败!");
}
}
}
在上述代码中我们调用了两个类Pattern和Matcher,这两个类实际上与String.matches()相同,因为String.matches()方法内部调用的就是这两个类。
使用String.matches()方法效率低,因此建议使用Pattern和Matcher这两个类。
步骤:
- 使用Pattern的静态方法compile(String 正则)创建Pattern类。
- 使用Pattern类的matcher()方法,对字符串进行匹配,返回值为Matcher类的实例。
- Mathcer的matches()方法返回值为boolean类型,是否匹配成功,group(index)返回字符串,内容为分组匹配的内容。
非贪婪匹配
Java中正则表达式默认贪婪匹配,例:
"1230000".matches("(\\d+)(0*)");
匹配的第一组数据为“1230000”,第二组为空,这就是贪婪匹配。
非贪婪匹配:在“\d+”后边加一个?,即可非贪婪匹配。
例:(\d??)(9*)匹配“9999”第一组为空,第二组为“9999”。第一个?表示一个或0个,第二个?表示非贪婪匹配。
split()方法
该方法传入的是正则表达式,"a, b ;; c".split("[\\,\\;\\s]+"); // { "a", "b", "c" }
搜索字符串:
public class Main {
public static void main(String[] args) {
String s = "the quick brown fox jumps over the lazy dog.";
Pattern p = Pattern.compile("\\wo\\w");
Matcher m = p.matcher(s);
while (m.find()) {
String sub = s.substring(m.start(), m.end());
System.out.println(sub);
}
}
}
row
fox
dog
替换字符串:String.replaceAll()
public class Main {
public static void main(String[] args) {
String s = "The quick\t\t brown fox jumps over the lazy dog.";
String r = s.replaceAll("\\s+", " ");
System.out.println(r); // "The quick brown fox jumps over the lazy dog."
}
}
反向引用:
public class Main {
public static void main(String[] args) {
String s = "the quick brown fox jumps over the lazy dog.";
String r = s.replaceAll("\\s([a-z]{4})\\s", " <b>$1</b> ");
System.out.println(r);
}
}
使用replaceAll()的时候,我们传入的第二个参数可以使用$1、$2来反向引用匹配到的子串。