黑马程序员——Java基础—正则表达式


Java基础之正则表达式



正则表达式:可理解为符合一定规则的表达式。

作用:专门用于操作字符串。

特点:用一些特定的符号来表示一些代码操作,可以简化书写。因此,学习正则表达式就是学习一些特殊符号的使用。

好处:可以简化对字符串的复杂操作。弊端:符号定义越多,正则越长,阅读性越差。

具体操作功能:

1.匹配:String的matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

代码示例:

class  RegexDemo
{
	public static void main(String[] args) 
	{
		checkTel();
	}
	/*
	练习:对手机号码进行校验。
	规定手机号码只有:13xxx , 15xxx , 18xxx 这三个号段的。
	长度是11位的。
	*/
	public static void checkTel()
	{
		String tel = "15588644488";

		String regex = "1[358]\\d{9}";

		System.out.println(tel.matches(regex));
	}

	/*
	对QQ号码进行校验
	要求:5~15  0不能开头,只能是数字
	*/
	public static void checkQQ_reg()
	{
		String qq = "12002531";

		String regex = "[1-9]\\d{4,14}";  //定义正则表达式。

		System.out.println(qq.matches(regex));
	}

	//下面的方式也可以完成,但代码量过多,不够简化。学习了正则之后就变得简单多了。
	public static void checkQQ()
	{
		String qq = "65655454";

		int len = qq.length();
		System.out.println(len);

		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("出现非法的字符...");
				}
				/*
				char[] arr = qq.toCharArray();

				boolean flag = true;
				for(int x=0; x<arr.length; x++)
				{
					if(!(arr[x]>='0' && arr[x]<='9'))
					{
						flag = false;
						break;
					}
				}
				if(flag)
					System.out.println("qq:"+qq);
				else
					System.out.println("请输入正确的数字");
				*/
			}
			else
				System.out.println("不能以'0'开头");
		}
		else
			System.out.println("长度错误");
	}
}

2.切割:String split(); 

3.替换:String replaceAll(regex,str):使用给定的字符串替换此字符串中所有匹配正则表达式的子字符串。 

如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
为了可以让规则的结果被重用,可以将规则封装成一个组,用()表示。组的出现都有编号,从1开始编号。想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。 在正则里 .代表任意字符。

在替换当中,可以用"$"来获取到规则里的组。str.replaceAll("(.)\\1+","$1"); "$1"是代表前面规则里的第1个组。 \b 单词边界 。

切割代码示例:

class RegexDemo1 
{
	public static void main(String[] args)  
	{
		splitDemo("zhangsan  lisi    wangwu"," +");  //X+  X,一次或多次

		splitDemo("zhangsan.lisi.wangwu","\\."); //在正则里 .代表任意字符。
		
		splitDemo("d:\\java2014\\day21","\\\\"); //在java中"\"会将后面的字符转义,要成对的出现"\\"

		/*
		需求:按照叠词完成切割。
		为了可以让规则的结果被重用,可以将规则封装成一个组,用()表示。
		组的出现都有编号,从1开始编号。想要使用已有的组可以通过 \n(n就是组的编号)的
		形式来获取。
		*/
		splitDemo("dfwwokadddlkqqqqqrw","(.)\\1+"); 
	}
	public static void splitDemo(String str,String regex)
	{
		String[] arr = str.split(regex);

		System.out.println(arr.length);

		for(String s : arr)
		{
			System.out.println(s);
		}
	}
}
替换与组的代码演示:
<span style="white-space:pre">	</span>public static void replaceAllDemo1()
	{
		//需求:将字符串中出现的叠词替换成单个的"&"。

		String str = "dfwwokadddlkqqqqqrw";

		String regex = "(.)\\1+";

		String newStr = str.replaceAll(regex,"&");

		System.out.println(newStr);
	}
	public static void replaceAllDemo2()
	{
		//需求:将字符串中重叠的字母替换成单个字母。 zzzz-->z
		String str = "dfwwokadddlkqqqqqrw";

		String regex = "(.)\\1+";

		String newStr = str.replaceAll(regex,"$1");

		System.out.println(newStr);
	}

正则表达式的第4个功能就是获取:将字符串中符合规则的子串取出。

操作步骤:

1.通过Pattern类的compile方法将正则表达式封装成对象。示例:Pattern p = Pattern.compile(regex); 

2.让正则对象和要操作的字符串相关联。获取匹配器对象。 示例:Matcher m = p.matcher(String); 

3.将规则作用到字符串上,并进行符合规则的子串查找。示例:boolean b = m.find(); m.group():用于获取匹配后结果。代码示例如下:

import java.util.regex.*;
class  RegexDemo3
{
	public static void main(String[] args) 
	{
		getDemo();
	}
	public static void getDemo()
	{
		String str = "jidu yu zhao hui shi jida de aomi";

		String regex = "\\b[a-z]{4}\\b";

		//1.将正则表达式封装成对象。
		Pattern p = Pattern.compile(regex);
	
		//2.让正则对象和要操作的字符串相关联。获取匹配器对象。
		Matcher m = p.matcher(str);

		while(m.find()) //3.进行符合规则的子串查找。
		{
			//4.获取匹配后结果。
			System.out.println(m.group());
		}
	}
}

正则表达式学习了四种具体的操作功能,在实际的应用中,到底用四种功能中的哪一个呢?或者哪几个呢?

思考方式:

1,如果只想知道该字符串是对是错,使用匹配。

2,想要将已有的字符串变成另一个字符串,使用替换。

3,想要按照指定的方式将字符串变成多个字符串,使用切割。获取规则以外的子串。

4,想要拿到符合规则的字符串子串,使用获取。获取符合规则的子串。

/*
网页爬虫(蜘蛛)。
练习:1.获取指定文档中的邮箱地址。2.获取网页中的邮箱地址。
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;

class  RegexTest1
{
	public static void main(String[] args) throws IOException
	{
		getMail();
	}
	public static void getMail_1() throws IOException
	{
		String regex = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";

		Pattern p = Pattern.compile(regex);

		URL url = new URL("http:\\127.0.0.1:10010");

		URLConnection conn = url.openConnection();

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

		for(String line=null; (line=bufIn.readLine())!=null; )
		{
			Matcher m = p.matcher(line);

			while(m.find())
				System.out.println(m.group());
		}
	}
	public static void getMail() throws IOException
	{
		//需求:获取指定文档中的邮箱地址,使用正则的获取功能。Pattern  Matcher

		String regex = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";

		Pattern p = Pattern.compile(regex);

		BufferedReader bufr = new BufferedReader(new FileReader("mail.txt"));

		for(String line=null; (line=bufr.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、付费专栏及课程。

余额充值