`
milimili
  • 浏览: 3194 次
社区版块
存档分类
最新评论

Regular Expression

 
阅读更多
正则表达式
一、概述
        1、 概念:符合一定规则的表达式。
        2、 作用:用于专门操作字符串。
        3、 特点:用于一些特定的符号来表示一些代码操作,这样可以简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。
        4、 好处:可以简化对字符串的复杂操作。
        5、 弊端:符合定义越多,正则越长,阅读性越差。

二、常见符号
       说明:X表示字符X或者匹配的规则。
1、字符
        x                  字符 x
        \\                 反斜线字符
        \t                 制表符 ('\u0009')
        \n                 新行(换行)符 ('\u000A')
        \r                 回车符 ('\u000D')
        \f                 换页符 ('\u000C')
        \a                 报警 (bell) 符 ('\u0007')
2、字符类
        [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](减去)
3、预定义字符类
        .                         任何字符(与行结束符可能匹配也可能不匹配)
        \d                        数字:[0-9]
        \D                       非数字: [^0-9]
        \s                        空白字符:[ \t\n\x0B\f\r]
        \S                       非空白字符:[^\s]
        \w                       单词字符:[a-zA-Z_0-9]
        \W                      非单词字符:[^\w]
4、边界匹配器
        ^                         行的开头
        $                         行的结尾
        \b                        单词边界
        \B                       非单词边界
        \A                       输入的开头
        \G                       上一个匹配的结尾
        \Z                       输入的结尾,仅用于最后的结束符(如果有的话)
        \z                       输入的结尾
5、Greedy数量词
        X?                       X,一次或一次也没有
        X*                       X,零次或多次
        X+                       X,一次或多次
        X{n}                     X,恰好 n次
        X{n,}                    X,至少 n次
        X{n,m}                   X,至少 n次,但是不超过 m 次
6、组和捕获
       捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:
                    1     ((A)(B(C)))
                    2     \A
                    3     (B(C))
                    4     (C)
       组零始终代表整个表达式。在替换中常用$匹配组的内容。
三、正则表达式具体功能
        主要有四种具体功能:匹配matches、切割split、替换replaceAll和获取find
1、匹配:String类中的boolean matches(String regex)方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
示例:
class  MatchesDemo
{
	/*
	对QQ号码进行校验
	要求:5~15  0不能开头,只能是数字
	*/
	//方式一,不用正则表达式
	public static void qqCheck_1(String qq)
	{
		if (!qq.startsWith("0"))
		{
			if (qq.length()>=5&&qq.length()<=15)
			{
				try
				{
					long l=Long.parseLong(qq);//利用封装基本数据类型出现非数字报异常的特点
					System.out.println(qq);
				}
				catch (NumberFormatException e)
				{
					System.out.println("包含非法字符!");
				}
			}
			else
				System.out.println("你输入的长度非法!");
		}
		else
			System.out.println("没有0开头的号码,请重输!");
	}
	
	//方式二,用正则来实现
	public static void qqCheck_2(String qq)
	{
		String regex="[1-9]\\d{4,14}";
		if (qq.matches(regex))//用String类中matches方法来匹配
		{
			System.out.println(qq);
		}
		else
			System.out.println(qq+":是非法的号码!");

	}


	/*
		匹配
		手机号段只有 13xxx 15xxx 18xxxx
	*/

	public static void phoneCheck(String phone)
	{
		String regex="1[358]\\d{9}";
		if (phone.matches(regex))
		{
			System.out.println(phone+":::is ok..");
		}
		else
			System.out.println("手机号码输入有误!");
	}


	public static void main(String[] args) 
	{
		String qq="125696";
		qqCheck_1(qq);//不用正则的方式
		qqCheck_2(qq);//用正则的方式

		String phone="13345678910";
		phoneCheck(phone);//匹配手机号码是否正确
	}
}

2、切割:String类中的String[] split(String regex)方法。
示例:
class SplitDemo 
{

	public static void main(String[] args) 
	{
		String regex1="\\.";//按 .切
		String regex2=" +";//按空格切,可能有一个空格或者多个空格
		String regex3="(.)\\1+";//按照出现两次或者以上的叠词切
		String[] arr="192.168.1.62".split(regex1);//按 . 切
		print(arr);

		arr ="wo  shi   shui    545  21     3".split(regex2);//按空格切
		print(arr);

		arr="erkktyqqquizzzzzo".split(regex3);//按叠词切
		print(arr);	
	}

	//遍历
	public static void print(String[] arr)
	{
		for (String s : arr)
		{
			System.out.println(s);
		}
	}
}

说明:
        按叠词完成切割:为了让规则被重用,可将规则封装成一个组,用()完成。组的出现都有编号,从1开始。想要使用已有的组可通过\n(n就是组的编号)的形式来获取。
        对于组中所匹配的字符,可以用$n来获取。$在正则中表示行的结尾,所以出现在正则中不能用来表示组,一般用于替换中。如下面功能中。
//3、替换: String replaceAll(String regex,String replacement)方法。
class ReplaceDemo 
{
	public static void main(String[] args) 
	{
		String regex1="\\d{5,}";//将字符串中数字替换成#
		String regex2="(.)\\1+";//将叠词替换为一个

		String s1="erej569831217woshi2659810wosxs12356f";
		s1=s1.replaceAll(regex1, "#");//将字符串中的数字替换成#

		String s2="erkktyqqquizzzzzo";
		s2=s2.replaceAll(regex2, "$1");//将叠词替换为一个,其中$1表示符合组中一个字符

		System.out.println("s1:"+s1);
		System.out.println("s2:"+s2);
	}
}

4、获取:将字符串中的符合规则的子串取出。
操作步骤:
        1)将正则表达式封装成对象。
        2)让正则对象和要操作的字符串相关联。
        3)关联后,获取正则匹配器。
        4)通过匹配器对符合规则的子串进行操作,比如取出。
示例:
import java .util.regex.*;
class  PatternDemo
{
	public static void main(String[] args) 
	{
		String s= "ming tian jiu yao fang jia le ,da jia。";
		String regex="\\b[a-z]{4}\\b";
		get(s,regex);
	}
	public static void get(String s,String regex)
	{
		//将规则封装成对象。
		Pattern p=Pattern.compile(regex);
		//让正则对象和要作用的字符串相关联。获取匹配器对象。
		Matcher m=p.matcher(s);

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

		while(m.find())//find()方法是将规则作用到字符串上,并进行符合规则的子串查找。
		{
			System.out.println(m.group());//group()方法用于获取匹配后结果。
			System.out.println(m.start()+"...."+m.end());
//start()和end()分别表示匹配字符的开始和结尾的索引
		}
	}
}

四、练习
四种功能的选择(思路方式):
        1)如果只想知道该字符是对是错,使用匹配。
        2)想要将已有的字符串变成另一个字符串,替换。
        3)想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
        4)想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
练习1
/*
练习:
需求:将下列字符串转成:我要学编程
"我我...我..我要...要...要要....学学....学学学......编编编...程...程程...."

思路:
将已有字符串变成另一个字符串。使用替换功能。
1、可以先将 . 去掉。
2、再将多个重复的内容变成单个内容。

*/
class  ReplaceTest
{
	public static void main(String[] args) 
	{
		String s="我我...我..我要...要...要要....学学....学学学......编编编...程...程程....";
		System.out.println(s);

		String regex="\\.+";//先将 . 去掉
		s=s.replaceAll(regex,"");//去掉 .
		System.out.println(s);

		regex="(.)\\1+";//将重复的内容变成单个内容
		s=s.replaceAll(regex,"$1");//去重
		System.out.println(s);
	}
}


练习2
/*
需求:
将ip地址进行地址段顺序的排序。
192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301

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

*/
import java.util.*;

class  IPSortTest
{
	public static void main(String[] args) 
	{
		String ip="192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.301";
		System.out.println(ip);

		String regex="(\\d+)";
		ip=ip.replaceAll(regex,"00$1");//保证每段至少都有三位-------------
		System.out.println(ip);

		regex="0*(\\d{3})";
		ip=ip.replaceAll(regex,"$1");//每段只保留三位
		System.out.println(ip);

		regex=" ";
		String[] arr=ip.split(regex);//按照空格切
		
		//定义一个TreeSet集合,利用元素自然排序
		TreeSet<String > ts=new TreeSet<String>();
		for (String str : arr )
		{
			ts.add(str);//添加
		}
		
		regex="0*(\\d+)";//把每段前面多余的0替换掉
		for (String s : ts)
		{
			System.out.println(s.replaceAll(regex,"$1"));//把每段前面多余的0替换掉
		}
	}
}

练习3
//需求:对邮件地址进行校验。

class  CheckMail
{
	public static void main(String[] args) 
	{
		String mail="123a809bc@sina.com.cn";
		String regex="\\w+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";//较为精确
		regex="\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。

		boolean b=mail.matches(regex);
		System.out.println(b);
	}
}

练习4
/*
网络爬虫(蜘蛛)
实际上是一个功能,用于搜集网络上的指定信息
需求:可用于收集邮箱,qq号等之类的信息。
应用:如通过关键字搜索blog,实际就是使用的“蜘蛛”,通过查找关键字获取相关的blog
*/

import java.net.*;
import java.util.regex.*;
import java.io.*;

class  Spider
{
	public static void main(String[] args)throws Exception
	{
		//getFileMail();
		getWebMail();
		
	}

	//获取网页中mail
	public static  void getWebMail()throws Exception
	{
		//封装网页地址
		URL url=new URL("http://tieba.baidu.com/p/1390896758");
		//连接服务器
		URLConnection conn=url.openConnection();
		//带缓冲区的网页读取流
		BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		String line=null;
		
		//定义匹配邮件地址的正则表达式
		String regex="\\w+@\\w+(\\.\\w+)+";
		Pattern p=Pattern.compile(regex);//封装正则表达式
		//读取网页数据
		while ((line=br.readLine())!=null)
		{
			//正则关联数据
			Matcher m=p.matcher(line);
			//寻找匹配邮箱
			while (m.find())
			{
				System.out.println(m.group());//输出匹配邮箱
			}		
		}	
	}

	//获取指定文档中的邮件地址。使用获取功能。Pattern  Matcher
	public static void getFileMail()throws Exception
	{
		//将文件封装成对象
		File file=new File("E:\\Java Study\\Practice\\day25\\mail.txt");
		//创建带缓冲区的读取流
		BufferedReader br=new BufferedReader(new FileReader(file));
		String line=null;

		//定义正则表达式
		String regex="\\w+@[a-zA-Z]+(\\.[a-zA-z]+)+";
		//创建Pattern对象,封装正则表达式
		Pattern p=Pattern.compile(regex);

		//读取文件中数据
		while ((line=br.readLine())!=null)
		{	
			
			//关流字符串
			Matcher m=p.matcher(line);
			while (m.find())//寻找匹配的字符串
			{
				System.out.println(m.group());//输出匹配的字符串
			}
		}
	}
}
分享到:
评论

相关推荐

    Regular Expression 简介.pdf

    ### Regular Expression 简介 #### 一、何为 Regular Expression (正则表达式) 正则表达式(Regular Expression)是一种强大的文本模式匹配工具,在文本处理领域占据着极其重要的地位。它提供了一种简洁的方式来...

    regular expression library正则表达式库

    GNU Regex 程式库是 GNU 发展,提供操作比对 Regular Expression 文字字串的程式库,也就是使用 GNU Regex 程式库,可以作到以下的功能: 比对一字串是否完全与 Regular Expression 相幅合。 在一字串中寻找与 ...

    Regular Expression Pocket Reference.chm

    Regular Expression Pocket Reference

    eclipse regular expression 插件

    eclipse regular expression 插件

    Regular Expression Quick Reference v1.00

    Regular Expression Quick Reference

    正则表达式资料全集 Regular Expression Syntax Reference

    正则表达式(Regular Expression)是一种强大的文本处理工具,它能用来进行字符串匹配、查找、替换等操作。在编程语言中,正则表达式被广泛应用于数据验证、文本解析、日志分析等领域。本资料全集是针对正则表达式...

    regular expression

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据提取、搜索替换等场景。在 Vim 编辑器中,正则表达式功能强大,能够帮助程序员和开发者在大型项目中高效地进行...

    Regular Expression Recipes for Windows Developers.pdf

    根据提供的文件信息,本书《Regular Expression Recipes for Windows Developers: A Problem-Solution Approach》是一本针对Windows开发者关于正则表达式的实用指南。本书作者是Nathan A. Good,并于2005年出版。...

    正则表达式grep[global search regular expression]

    ### 正则表达式grep[global search regular expression] #### 一、grep简介 `grep`是一种功能强大的文本搜索工具,可以使用正则表达式在文本中查找特定模式,并将匹配的行输出到标准输出。这一工具最初设计用于...

    基于Regular Expression的数据匹配验证.pdf

    "基于Regular Expression的数据匹配验证" 基于Regular Expression的数据匹配验证是指使用Regular Expression(正则表达式)来对用户输入的数据进行匹配验证,以确保数据的正确性和合法性。在Web开发中,数据验证是...

    Regular Expression Cookbook

    正则表达式(Regular Expression),简称为regex,是计算机科学中用于处理字符串的强大工具。它通过一种模式匹配的方式来搜索、替换或提取文本,广泛应用于文本编辑器、编程语言、搜索引擎以及各种数据处理任务中。...

    Oralce Regular Expression

    ### Oracle Regular Expression详解 #### 引言 Oracle正则表达式提供了一种强大的方式来识别文本体中的模式。模式描述了需要识别的文本外观,它可以是相当简单的(例如描述任何三个字母组成的单词),也可以是非常...

    regular expression processor

    regular expression processor, 将正则表达式转换成NFA,接着讲NFA转换成DFA,并输出DFA。同时可以生成DOT文件,以提供给graphviz生成图形界面。

    A Regular Expression Wrapper Using ATL in C++Src.zip

    本项目"A Regular Expression Wrapper Using ATL in C++Src.zip"似乎是一个源代码包,其中包含了使用ATL实现正则表达式封装的示例代码。 正则表达式是一种强大的文本处理工具,能够用来匹配、查找、替换和解析字符...

    正则表达式(regular expression)

    正则表达式(regular expression)  原著:笑容  创作于:2004年05月03日 最后更新:2004年05月04日 21:12 引用地址:正则表达式(regular expression) 版权声明:使用创作公用版权协议 ...

    Regular expression.pdf

    介绍正则表达式的英文slide 使用Python和Java实现相应的功能 文件已加密,可在下载后与我联系,免费获得解锁密码

Global site tag (gtag.js) - Google Analytics