正则表达式:用于操作字符串的一个规则,正则表达式的规则使用了特殊的符号表示
需求:校验一个QQ号:
1.不能以0开头
2.长度5~11
matches(String regex):告知此字符串是否匹配给定的正则表达式
*
* 预定义字符类:
* .任何字符(与行结束符可能匹配也可能不匹配)
* \d 数字:[0-9]
* \D 非数字:[^0-9]
* \s 空白字符:[ \t\n\x0B\f\r]
* \S 非空白字符:[^\s]
* \w 单词字符:[a-zA-Z_0-9]
* \W 非单词字符:[^\w]
*
*
* Greedy数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
字符类 范围词
[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-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](减去)
注意:范围词里面不管内容有多长,没有数量词的配合都只能匹配一个字符而已。
* 查找:
* 需要使用的对象:
* 1.Pattern:正则对象
* 2.Matcher:匹配器对象
* 匹配器要使用到的方法:
* 1.find() 通知匹配器去匹配字符串,查找符合规则的字符串,如果找到返回true,否则返回false
* 2.group() 获取符合规则的子串
* 注意:使用group方法的时候一定要先调用find方法让匹配器去查找符合规则的字符串,否则报错
*
* Pattern:
指定为字符串的正则表达式必须首先被编译为此类的实例。
然后,可将得到的正则对象匹配任意的字符串用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。
执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
\b 单词边界匹配器只是代表了单词的开始或者是结束部分,不匹配任何的字符
匹配邮箱:
需求:校验一个QQ号:
1.不能以0开头
2.长度5~11
3.只能由数字组成
public class Demo1 {
public static void main(String[] args) {
String qq = "012345477";
/*if(!qq.startsWith("0")){
if(qq.length()>=5&&qq.length()<=11){
try{
Long.parseLong(qq);
System.out.println("你的QQ合法");
}catch(Exception e){
System.out.println("非法QQ,QQ号只能由数字组成");
}
}else{
System.out.println("非法QQ,QQ号的长度只能是5~11位");
}
}else{
//以0开头
System.out.println("非法QQ,QQ号不能以0开头");
}*/
System.out.println(qq.matches("[1-9]\\d{4,10}")?"合法QQ":"非法QQ");
}
}
matches(String regex):告知此字符串是否匹配给定的正则表达式
*
* 预定义字符类:
* .任何字符(与行结束符可能匹配也可能不匹配)
* \d 数字:[0-9]
* \D 非数字:[^0-9]
* \s 空白字符:[ \t\n\x0B\f\r]
* \S 非空白字符:[^\s]
* \w 单词字符:[a-zA-Z_0-9]
* \W 非单词字符:[^\w]
*
*
* Greedy数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
字符类 范围词
[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-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](减去)
注意:范围词里面不管内容有多长,没有数量词的配合都只能匹配一个字符而已。
public class Demo2 {
public static void main(String[] args) {
// 预定义字符类:
System.out.println("任意字符:"+("%".matches(".")));
System.out.println("数字字符:"+("1".matches("\\d")));
System.out.println("非数字字符:"+("a".matches("\\D")));
System.out.println("空白字符:"+("\r".matches("\\s"))); //\r 回车 也属于空白字符
System.out.println("非空白字符:"+("\n".matches("\\S")));
System.out.println("单词字符:"+("1".matches("\\w")));
System.out.println("非单词字符:"+("@".matches("\\W")));
// Greedy数量词
System.out.println("?一次或一次都没有出现:" +("".matches("\\d?")));
System.out.println("?零次或多次出现:" +("2".matches("\\d*"))); //true???
System.out.println("+一次或多次 :" +("".matches("\\d+")));
System.out.println("{n}恰好 11 次 :" +("12345678965".matches("\\d{11}")));
System.out.println("{n,}至少11 次 :" +("123456785".matches("\\d{11,}")));
System.out.println("{n,m}指定次数范围 :" +("123".matches("\\d{3,4}")));
// 字符类 范围词
System.out.println("abc".matches("[abc]")); //false
System.out.println("abc".matches("[abc]{3}")); //true
System.out.println("d".matches("[^abc]"));
System.out.println("字符可以出现在a-z之间:"+("a".matches("[a-z]")));
System.out.println("字符可以出现在a-z之间:"+("$".matches("[a-zA-Z$#]")));
}
}
正则表达式主要是用于操作字符串的规则,正则表达式对字符串的操作主要有一下几种应用:
* 匹配:matches();
*
* 切割:split()
*
* 替换:replaceAll(String regex,String replacement)
*
* 查找:
public class Demo3 {
public static void main(String[] args) {
matchesPhone("13360500516");
matchesTe("0755-28562334");
testSplit();
testSplit2();
replaceTest1();
replaceTest2();
}
//编写一个正则表达式平匹配手机号
public static void matchesPhone(String phone){
System.out.println(phone.matches("1[34578]\\d{9}")?"合法手机号":"非法手机号");
}
//匹配固定电话 区号-主机号 区号:首位是0 长度:3-4 主机号:首位不能是0,长度:7-8位
public static void matchesTe(String tel){
System.out.println(tel.matches("0\\d{2,3}-[1-9]\\d{6,7}")?"合法固话":"非法固话");
}
public static void testSplit(){
String str = "明 天 放 假";
//按照空格来切割
String[] datas = str.split(" +");
System.out.println("数组的元素是:"+Arrays.toString(datas));
}
//根据重叠词进行切割
public static void testSplit2(){
String str = "大家家家明天天玩得得得得得得得得开心"; //切割后为:大 明 玩 开心
/*
* 如果正则的内容需要被复用,那么需要对正则的内容进行分组,分组的目的是为了提高正则的复用性。组号不能指定,从1开始
* \1:代表第一组的内容
*/
//
String[] datas = str.split("(.)\\1+");
System.out.println("数组的元素是:"+Arrays.toString(datas));
}
//替换 把号码替换成*号
public static void replaceTest1(){
String str = "如有需求请联系我:13458769837如有需求请联系我:13458769837"
+ "如有需求请联系我:13458769837如有需求请联系我:13458769837如有需求请联系我:13458769837";
String reg = "1[34578]//d{9}";
str = str.replaceAll(reg, "****");
System.out.println("被替换的内容是:"+str);
//为什么出不来??????????????
}
public static void replaceTest2(){
String str = "我我我我我我要要要做做做项项项项项项项项项项项目目"; //替换成:我要做项目
//如果需要在replaceAll方法正则的外部引用组的内容,那么是使用“$组号”
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
}
* 查找:
* 需要使用的对象:
* 1.Pattern:正则对象
* 2.Matcher:匹配器对象
* 匹配器要使用到的方法:
* 1.find() 通知匹配器去匹配字符串,查找符合规则的字符串,如果找到返回true,否则返回false
* 2.group() 获取符合规则的子串
* 注意:使用group方法的时候一定要先调用find方法让匹配器去查找符合规则的字符串,否则报错
*
* Pattern:
指定为字符串的正则表达式必须首先被编译为此类的实例。
然后,可将得到的正则对象匹配任意的字符串用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。
执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
public class Demo4 {
public static void main(String[] args) {
//找出三个字母的单词
String content = "da jia de jia qi wang bi liao hai kai xin ma";
String reg = "\\b[a-zA-Z]{3}\\b";
//先把字符串的正则编译成Pattern对象:
Pattern p = Pattern.compile(reg);
//使用正则对象匹配字符串用于产生一个Matcher对象:
Matcher m = p.matcher(content);
/*System.out.println("有符合规则的字符串吗:"+m.find());
System.out.println("获取结果:"+m.group());*/
while(m.find()){
System.out.println(m.group());
}
}
}
单词边界匹配器
\b 单词边界匹配器只是代表了单词的开始或者是结束部分,不匹配任何的字符
public class Demo5 {
public static void main(String[] args) {
System.out.println("hello world".matches("hello\\b world"));
}
}
匹配邮箱:
package express;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
网络爬虫(网络蜘蛛)
*/
public class Demo6 {
public static void main(String[] args) {
String content = "有事没事请联系:45324@qq.com有事没事请联系:45324@163.com"
+ "有事没事请联系:45324@qq.com.cn有事没事请联系:45324@qq.net";
/*//规则:第一位:a-z A-Z 1-9
第二位:单词\w
*/
String reg = "[a-zA-Z1-9]\\w{5,17}@[a-zA-Z]{2,}(\\.(com|cn|net)){1,2}";
//把字符串的正则编译成正则对象
Pattern p = Pattern.compile(reg);
//使用正则对象产生匹配器对象
Matcher m =p.matcher(content);
while(m.find()){
System.out.println(m.group());
}
}
}