黑马程序员——正则表达式

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


-正则表达式(符合一定规则的表达式)
作用:专门用于操作字符串
特点:用于一些特定的符号来表示一些代码操作
好处:可以简化对字符串的复杂操作
弊端:规则字符定义的越多,越不便阅读,造成阅读性差

具体操作功能:-----参考查看API文档----
1、匹配:String matches()方法;用规则匹配整个字符串,只要有一处不符合规则,则返回false
2、切割:String split()
3、替换:String replaceAll();

4、获取:Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str);

-练习1:对QQ号码进行校验
要求:5-15位,0不能为开头,而且只允许数字

public class Day25_01_Regex {

	public static void main(String[] args) {
		
		BufferedReader br = null;
		try {
			//从键盘获取输入注册号码
			System.out.println("请输入注册号码:");
			br = new BufferedReader(new InputStreamReader(System.in));
			
			String line = null;
			while((line=br.readLine())!=null){
				String qq = line;
				//进行校验
				checkQQ2(qq);
			}
		} catch (Exception e) {
			throw new RuntimeException("系统出现问题,暂时不能注销!");
		} finally {
			//释放资源
			if(!(br==null)){
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	//方法3:通过正则表达式进行校验
	public static void checkQQ3(String qq){
		
		String regex = "[1-9][0-9]{4,14}";
		boolean flag = qq.matches(regex);
		if(flag)
			System.out.println("您注册的qq号码为:"+qq);
		else
			System.out.println("注册的qq号码不正确,请重输!");
		
	}
	
	//方法2:使用Integer.parseInt("123423add342");
	//将会产生java.lang.NumberFormatException:异常,从而达到校验目的
	public static void checkQQ2(String qq){
		
		int len = qq.length();
		if(len>=5 && len<=15){
			if(!qq.startsWith("0")){
				
				try {
					long l = Long.parseLong(qq);
					System.out.println("注册的qq号码为:"+qq);
				} catch (NumberFormatException e) {
					System.out.println("注册的qq号码不正确,请重输!");
					//e.printStackTrace();
				}
			}
			else {
				System.out.println("不能以0开头");
			}
		}
		else {
			System.out.println("长度不对");
		}
		
	}
	
	//方法1:常规判断
	public static void checkQQ1(String qq){
		
		int len = qq.length();
		if(len>=5 && len<=15){
			if(!qq.startsWith("0")){
				char[] arr = qq.toCharArray();//将字符串转换为字符数组
				boolean flag = true;
				for(int i=0;i<arr.length;i++){
					if(!(arr[i]>='0' && arr[i]<='9')){
						flag = false;
						break;
					}
				}
				if(flag){
					System.out.println("您注册的qq号码为:"+qq);
				}
				else{
					System.out.println("注册的qq号码不正确,请重输!");
				}
			}
			else {
				System.out.println("不能以0开头");
			}
		}
		else {
			System.out.println("长度不对");
		}
	}
}

-正则表达式常用方法

1、匹配:String matches()
2、切割:String split()
3、替换:String replaceAll();

package day25_Regex;
public class Day25_02_RegexDemo {

	public static void main(String[] args) {
		
		//=========替换=========
		replace();
		
		
		//=========切割=========
		/*
		 按照叠词进行切割,为了可以让规则的结果被重用,可以将规则用()封装成一个组,组都是
		 有编号的,从1开始;
		 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取
		 */
		//通过叠词进行切割
		//split("zfdfdgddsdsqqerrebfd", "(.)\\1");
		
		//通过点"."进行切割
		//split("zhangsan.lisi.wangwu", "\\.");
		
		//通过空格" "进行切割
		//split("zhangsan lisi     wangwu", " +");
		
		
		//=========匹配=========
		//checkTelNum();
		//check();
	}
	
	//替换(  )
	public static void replace(){
		String str = "bdafdfffdsagdfdeeeeefswer";
		System.out.println(str);
		String regex = "(.)\\1+";
		
		String newStr1 = "\\$";//将叠词替换成$
		String newStr2 = "$1";//将叠词替换为它本身单个字符
		str = str.replaceAll(regex, newStr1);
		System.out.println(str);
	}
	
	//切割
	public static void split(String str, String regex){
		
		String [] arr = str.split(regex);
		System.out.println(arr.length);
		for(String s : arr){
			System.out.println(s);
		}
	}
	
	//匹配手机号码
	public static void checkTelNum(){
		String str = "13844336688";
		//定义匹配规则
		String reg = "1[358]\\d{9}";
		boolean b = str.matches(reg);
		if(b)
			System.out.println("有效手机号码:"+str);
		else
			System.out.println("无效手机号码: "+str);
	}
	
	//匹配下面正则表达式
	public static void check(){
		String str = "v3843";
		String reg = "[a-zA-Z]\\d*";
		boolean b = str.matches(reg);
		System.out.println(b);
	}
}

-正则表达式常见应用——获取
操作步骤:
1、将正则表达式封装成对象
2、让该对象和要操作的字符串相关联
3、关联后,获取正则匹配的引擎
4、通过引擎对符合规则的子字符串进行操作,比如取出

package day25_Regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Day25_05_RegexGet {

	public static void main(String[] args) {
		
		getStr();
	}
	
	
	//匹配下面正则表达式
	public static void getStr(){
		String str = "hao hao xue xi  tian tian xiang shang";
		System.out.println("原字符串: "+str);
		String reg = "\\b[a-zA-Z]{5}\\b";// ----\b 表示单词边界
		
		Pattern p = Pattern.compile(reg);
		
		Matcher m = p.matcher(str);
		
		//boolean b = m.find();//将规则作用到字符串上,并进行进行查找符合规则的字符串
		//System.out.println(b);
		//System.out.println(m.group());//用于获取匹配后结果
		
		System.out.println("matches:"+m.matches());//-----注意!为什么是false?-----
		while(m.find()){
			System.out.println(m.group());
			System.out.println(m.start()+"...."+m.end());
		}
	}
}

-正则表达式应用——常见的校验

package day25_Regex;

import java.util.TreeSet;

//正则表达式的小练习

public class Day25_06_RegexPractice {

	public static void main(String[] args) {
		
		checkMail();
		
		//ipSort();
		
		//test1();

	}
	
	//练习3:
	public static void checkMail(){
		String mail = "hello@outlook.com";
		String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)";//较为精确的匹配
		//reg = "\\w+@\\w+(\\.\\w+)+";//不太精确的匹配
		
		//mail = "1@1.1";
		//mail.indexOf("@")!=-1;
		
		System.out.println(mail.matches(reg));
	}
	
	//练习2:
	//将ip地址(例如:193.22.2.44  11.3.4.22  55.3.44.2  3.111.223.10)进行地址段排序
	public static void ipSort(){
		String ip = "193.22.2.44  11.3.4.22  55.3.44.2  3.111.223.10";
		ip = ip.replaceAll("(\\d+)", "00$1");
		System.out.println(ip);
		
		ip = ip.replaceAll("0*(\\d{3})", "$1");
		System.out.println(ip);
		
		String[] arr = ip.split(" ");
		TreeSet<String> ts = new TreeSet<String>();
		for(String s : arr){
			ts.add(s);
		}
		for(String s : ts){
			System.out.println(s.replaceAll("0*(\\d+)", "$1"));
		}
	}
	
	//练习1:
	//将"人人人之....之之...初初,性性性..本本本善善善" ---变为"人之初,性本善"
	public static void test1(){
		String str = "人人人之....之之...初初,性性性..本本本善善善";
		
		//1、先去掉"."
		str = str.replaceAll("\\.+", "");
		System.out.println(str);
		
		//2、叠词替换为该字符本身
		str = str.replaceAll("(.)\\1+", "$1");
		System.out.println(str);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值