Java基础_正则表达式

一、正则表达式(特点)

正则表达式:符合一定规则的表达式。

特点:用一些特定的符号来表示一些代码操作,这样就简化书写。

所以学习正则表达式就是在学习一些特殊符号的使用。

作用:用于操作字符串。

好处:可以简化对字符串的复杂操作。

弊端:符号定义越多,正则越长,阅读性越差。

先来看一个示例:


/*
示例:
*/
class RegexDemo 
{
	public static void main(String[] args) 
	{
		checkQQ_1();
		checkQQ_2();
	}

	/*
	对QQ号码进行校验:
	要求:5-15位。0不能开头,只能是数字。
	*/
	
	public static void checkQQ_2()//使用正则表达式
	{
		String qq="1a234576";
			
		String regex="[1-9][0-9]{4,14}";

		boolean flag=qq.matches(regex);

		if(flag)
		{	
			System.out.println("QQ:"+qq);
		}
		else
		{
			System.out.println("输入不合法");
		}
	}


	public static void checkQQ_1()//这种方式使用String类中的方法,进行组合完成了需求。但是代码国语复杂。
	{
		String qq="123456";
		int len=qq.length();
		if(len>=5 && len<=15)
		{
			if(!qq.startsWith("0"))
			{
				try
				{
					Long l=Long.parseLong(qq);
					System.out.println("QQ:"+l);
				}
				catch (NumberFormatException e)
				{
					System.out.println("出现非法字符");
				}	

				/*
				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("出现非法字符");
				}

				*/
			}
			else
			{
				System.out.println("不可以以0开头");
			}
		}
		else
		{
			System.out.println("长度错误。");
		}
	}
}


二、正则表达式(匹配)


/*
具体操作功能:
1.匹配。public boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
*/
class RegexDemo2 
{
	public static void main(String[] args) 
	{
		checkTel();
	}

	public static void checkTel()//手机号码段只有 187******** 150******** 178********
	{
		String str1="18712334567";
		String str2="10012334567";
		String reg="1[578]\\d{9}";
		System.out.println(str1.matches(reg));
		System.out.println(str2.matches(reg));
	}
	
}


三、正则表达式(切割)


/*
具体操作功能:
2.切割。public String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
*/
class RegexDemo3 
{
	public static void main(String[] args) 
	{
		splitDemo("zhangsan   lisi  wangwu        zhaoliu"," +");//切割包含多个空格的
		System.out.println();
		splitDemo("zhangsan.lisi.wangwu.zhaoliu","\\.");//切割包含.的
		System.out.println();
		splitDemo("c:\\abc\\a.txt","\\\\");//切割目录
		System.out.println();
		splitDemo("asdfassssdjfkzzzzzzodff","(.)\\1+");/*

														按照叠词完成切割,为了可以让规则的结果被重用,
														可以将规则封装成一个组,用()完成。组的出现都有编号,
														从1开始,想要使用自己已有的组,可以通过\n(n是组的编号)
														的形式来获取。
		
													   */
		
	}

	public static void splitDemo(String str,String reg)
	{
		String[] arr=str.split(reg);
		for(String s:arr)
		{
			System.out.println(s);
		}
	}
	
}


四、正则表达式(替换)

/*
具体操作功能:
3.替换。public String replaceAll(String regex,String replacement):
		使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 
*/
class RegexDemo4
{
	public static void main(String[] args) 
	{
		String str1="asdvfsa123124356asjdf4334543234iupok43234123fsa";
		replaceAllDemo(str1,"\\d{5,}","#");//将字符串中的数字长度大于5的子段替换成#

		String str2="asdfssswqqqfsdffff";//将重叠的字符替换成单个字母。例如: ssss----->s
		replaceAllDemo(str2,"(.)\\1+","$1");

		
	}

	public static void replaceAllDemo(String str,String reg,String newStr)
	{
		str=str.replaceAll(reg,newStr);
		System.out.println(str);
	}
	
}



五、正则表达式(获取)


/*
具体操作功能:
4.获取:将字符串中的符合规则的子串取出。

步骤:
1.将正则表达式封装成对象。
2.让正则对象和要操作的字符串相关联。
3.关联后,获取正则匹配引擎。
4.通过引擎对符合规则的字串进行操作,例如取出。

*/
import java.util.regex.*;

class RegexDemo5
{
	public static void main(String[] args) 
	{	
		getDemo();
	}

	public static void getDemo()
	{
		String str="java ji chu";

		String reg="\\b[a-z]{3}\\b";
		
		//将规则封装成对象。
		Pattern p=Pattern.compile(reg);

		//让正则对象和要作用的字符串相关联,获取匹配器对象。
		Matcher m=p.matcher(str);

		//System.out.println(m.matches());/*String类中的matches方法用的就是Pattern和Matcher对象来完成的*/
										 /*只不过被String的方法封装后,用起来较为简单,但功能单一。*/
		


		//System.out.println("matches:"+m.matches());//注意:同一个匹配器用的同一个指针。

		while(m.find())//将规则作用到字符串上,并进行符合规则的子串查找。
		{
			System.out.println(m.group());//用于获取匹配后结果。
		}
	}	
}


六、正则表达式(练习1)

/*
需求:
将下列字符串转成:我要学编程

用四种功能的哪一个呢?或哪几个呢?
思路:
1.如果只想知道该字符是否是对是错,使用匹配。
2.想要将已有的字符串变成另一个字符串,替换。
3.想要按照自定的方式将字符串编程多个字符串,切割。获取规则以外的子串。
4.想要拿到符合要求的字符串的字串,获取。获取符合规则的子串。

*/
class RegexText 
{
	public static void main(String[] args) 
	{
		test_1();
	}
	public static void test_1()
	{
		String str="我我我我.....我我我我..要..要要要要要...要要要要.学.学.学学学.编.编..编编编.程.程程程.程";

		/*
		将已有字符串编程另一个字符串,使用替换功能。

		1.可以现将.去掉
		2.再将多个重复的内容变成单个内容。

		*/

		str=str.replaceAll("\\.+","");
		System.out.println(str);

		str=str.replaceAll("(.)\\1+","$1");
		System.out.println(str);
	}
}


七、正则表达式(练习2)


/*
192.168.1.1 102.49.23.013 10.10.10.10 2.2.2.8 8.109.90.30
将ip地址进行地址段顺序排序。

还按照字符串自然顺序,只要让它们每一段都是3位即可。
1.按照每一段需要的对多的0进行补齐,那么每一段就会至少保证有3位。
2.将每一段只保留3位。这样,所有的ip地址都是每一段3位。
*/

import java.util.*;
class RegexText2
{
	public static void main(String[] args) 
	{
		ipSort();
		checkMail();
	}
	public static void ipSort()
	{
		String ip="192.168.1.1 102.49.23.013 10.10.10.10 2.2.2.8 8.109.90.30";

		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);
		}

		System.out.println();
		for(String s:ts)
		{
			System.out.println(s.replaceAll("0*(\\d+)","$1"));
		}
	}
	public static void checkMail()
	{
		String mail="abc@sohu.com.cn";

		String reg="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//精确匹配
		//reg="\\w+@\\w+(\\.\\w+){1,3}";//相对不太精确的匹配   1@2.1 就没意义了

		System.out.println();
		System.out.println(mail.matches(reg));
	}
}


八、正则表达式(网页爬虫)

网页:


<html>
	<head>
		<title>
		邮件获取
		</title>
	</head>

	<body>
		<div>
		djkfjalksdjflkdsajf zhangsan@126.com asdfaewfsdaf;wefaskjfdalkdsf
		alewjflkadsg lisi@sohu.com aslkjf;lsakdfj;oiewajflakjdsg;lkajdsgaaldskfljklj 
		fdjglkadjglkasdjf;lkjdsaf;lksaef ;lrsjg;;rajg aslkd;kdjflkjlsad
		arewjgalkfdjg;lkfdajg; w wangwu@126.com eokflasjglkajfd;glaijdg;
		welkjliewajugijfdalkg arj;lewaoigfla

		</div>
	</body>
</html>



/*
网页爬虫(蜘蛛)。

*/
import java.net.*;
import java.io.*;
import java.util.regex.*;
class RegexText3  
{
	public static void main(String[] args)throws Exception 
	{
		getMails();
	}
	public static void getMails()throws Exception
	{
		/*
		获取邮件地址。使用Pattern Matcher
		*/

		URL url=new URL("http://172.16.56.254:8080/myweb/mail.html");

		URLConnection conn=url.openConnection();

		BufferedReader bufrIn=new BufferedReader(new InputStreamReader(conn.getInputStream()));

		String line=null;
		
		String mailreg="\\w+@\\w+(\\.\\w+){1,3}";
		Pattern p=Pattern.compile(mailreg);

		while((line=bufrIn.readLine())!=null)
		{
			Matcher m=p.matcher(line);
			while(m.find())
			{
				System.out.println(m.group());
			}
		}
	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值