正则表达式

正则表达式:用于操作字符串的一个规则,正则表达式的规则使用了特殊的符号表示
 需求:校验一个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());
		}
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值