java基础---正则表达式

package cn.itcast.regex;
/*


正则表达式:正则表达式其实就是用于操作字符串的一个规则,正则表达式的规则使用了特殊符号来表示的


需求:校验一个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());
        }
}


}

猜你喜欢

转载自blog.csdn.net/sophiaviayang/article/details/76960428