/*
正则表达式:正则表达式其实就是用于操作字符串的一个规则,正则表达式的规则使用了特殊符号来表示的
需求:校验一个QQ号。
1.不能以0开头。
2.长度5~11
3.只能由数字组成
*/
public class Demo1 {
public static void main(String[] args) {
String qq = "ab567";
/*
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");
}
}
package cn.itcast.regex;
/*
预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
注意:任何预定于字符没有加上数量词之前都只能匹配一个字符而已。
数量词:
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-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"));
System.out.println("非空白字符:"+"\n".matches("\\S"));
System.out.println("单词字符:"+"_".matches("\\w"));
System.out.println("非单词字符:"+"%".matches("\\W"));
数量词
System.out.println("?一次或一次也没有:"+"1".matches("\\d?"));
System.out.println("* 零次次或多次也没有:"+"123".matches("\\d*"));
System.out.println("+至少出现一次:"+"1".matches("\\d+"));
System.out.println("{n}恰好出现n次:"+"12345678912".matches("\\d{11}"));
System.out.println("{n,}至少要出现n次:"+"1234567891245".matches("\\d{11,}"));
System.out.println("{n,m}指定出现次数的范围:"+"12345678912".matches("\\d{11,14}"));
范围词
*/
System.out.println("d".matches("[abc]"));
System.out.println("@".matches("[^abc]"));
System.out.println("字符可以出现在a-z之间:"+"d".matches("[a-z0-9]"));
System.out.println("d".matches("[abc]"));
}
}
package cn.itcast.regex;
import java.util.Arrays;
/*
正则表达式主要是用于字符串操作的规则,正则表达式对字符串的操作注意有一下几种应用:
匹配 match()
切割(split):
替换replaceAll(String regex,String replacement):
查找:
*/
public class Demo3 {
public static void main(String[] args) {
//matchesPhone("13556082481");
//matchesTel("020-38325152");
//testPlit1();
//testPlit2();
//replaceTest1();
replaceTest2();
}
//需求:编写一个正则表达式匹配手机号,第一位只能是1开头,第二位 :3,5,7,8 长度11位
public static void matchesPhone(String phone){
System.out.println(phone.matches("1[34578]\\d{9}")?"合法手机号":"非法手机号");
}
//需求2:匹配固定电话 区号-主机 区号:首位是0 长度:3-4 主机号:首位不能是0,长度7~8
public static void matchesTel(String tel){
System.out.println(tel.matches("0\\d{2,3}-[1-9]\\d{6,7}")?"合法电话号码":"非法电话号码");
}
//按照空格切割
public static void testPlit1(){
String str = "明 天 放 假";
String[] datas = str.split(" +");
System.out.println("数组的元素:"+Arrays.toString(datas));
}
//根据重叠词进行切割
public static void testPlit2(){
String str1 = "大家家明天天玩得得得得得得得开心";//大明玩开心
String[] datas1 = str1.split("(.)\\1+");//如果正则的内容需要被复用,需要对正则的内容进行分组,()分组的目的就是为了提高正则的复用性。组号不能指定,组号是从1开始
System.out.println("数组的元素1:"+Arrays.toString(datas1));
}
/*
(.)\\1+ ()分组:分组的目的是为了让正则的内容被复用起来。组号是从1开始。
((A)(B(C)))
组号1:((A)(B(C)))
第二组:(A)
第三组:(B(C))
第四组(C)
\1:引用第一组所匹配到的内容。
*/
//编写一个正则匹配一个邮箱:首字母a-zA-Z1-9 [email protected] [email protected] [email protected] [email protected]
//替换
public static void replaceTest1(){
String str2 = "如有需求请联系我:13556082123如有需求请联系我:13556082123如有需求请联系我:13556082123如有需求请联系我:13556082123"
+ "如有需求请联系我:13556082123如有需求请联系我:13556082123如有需求请联系我:13556082123如有需求请联系我:13556082123";
String reg = "1[34578]\\d{9}";
str2 = str2.replaceAll(reg, "******");
System.out.println("被替换的内容是"+str2);
}
public static void replaceTest2(){
String str = "我我我要要要做做做项项项项目";//还原结巴的话-------->我要做项目,把重叠词替换成的单个单词
str = str.replaceAll("(.)\\1+", "$1");//如果需要在replaceAll方法正则的外部引用组的内容,那么是使用$组号
System.out.println(str);
}
}
package cn.itcast.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
查找:
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的正则对象匹配任意字符串用于创建Matcher对象,
依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。因此典型的调用顺序是:
Pattern p = Pattern.compile("正则");
Matcher m = p.matcher("aaaaa")
boolean b = m.matches();
查找需要使用的对象:
1.Pattern(正则对象)
2.Matcher(匹配器对象)
匹配器要使用的方法:
1.find()通知匹配器去匹配字符串,查找符合规则的字符串。如果能查到的符合规则的字符串,则返回true,否则返回false;
2.group()获取符合规则的子串
注意:使用group方法的时候一定要先调用find方法让匹配器去查找符合规则的字符串,否则会报错的
*/
public class Demo4 {
public static void main(String[] args) {
//找出三个字母组成的单词给我
String content = "da jia de jia qi wan 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());
}
}
}
package cn.itcast.regex;
/*
单词边界匹配器
\b 单词边界匹配器只是代表;额单词的开始或者是结束部分,不匹配任何的字符
*/
public class Demo5 {
public static void main(String[] args) {
System.out.println("hello world".matches("hello\\b world"));
}
}
package cn.itcast.regex;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
网络爬虫(网络蜘蛛)
*/
public class Demo6 {
public static void main(String[] args) {
String content = "有事没事联系:[email protected] 有事没事联系:[email protected] 有事没事联系:1122423@qq 有事没事联系:1122423@qq 有事没事联系:1122423@qq "
+"有事没事联系:[email protected] 有事没事联系:[email protected] 有事没事联系:[email protected] " ;
String reg = "[a-zA-Z1-9]\\W{5,17}@[A-Za-z0-9]{2,}(\\.(com|cn|net)){1,2}";
//把字符串的正则编译成正则对象
Pattern p = Pattern.compile(reg);
//使用正则对象产生匹配器对象
Matcher m = p.matcher(content);
while(m.find()){
System.out.println(m.group());
}
}
}