补交20145226蓝墨云班课 -- 正则表达式作业

蓝墨云班课 -- 正则表达式作业

具体描述:

参考老师在博客园的 Intellj IDEA 简易教程中的单元测试,以TDD的放式学习云班课中“正则表达式简易教程.pdf”,在此贴出测试代码的码云链接和测试截图,测试案例不少于40个,要包含:元字符,字符转义,重复,字符类,分枝条件,反义,分组,后向引用,贪婪与懒惰等情况。

准备好上课对自己的测试和学习内容讲解。

内容:

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。正则表达式定义了字符串的模式,可以用来搜索、编辑或处理文本。

(1)元字符

常用元字符:
. 表示除了换行符之外任意一个字符
\s 空格字符(空格键、tab、换行、回车)
\S 非空格字符([^\s])
^ 一行的开始
$ 一行的结尾
[] 匹配方括号内的一个字符,例如:[abc]表示字符a,b,c中的任意一个(与a|b|c相同)

(2)字符转义

通常是指在正则表达式中有特殊含义的字符需要通过转义来使用,例如指示重复零次或更多次的*符号,若是需要使用时需要使用‘*’来匹配。

(3)重复

表示次数的元字符:

  • 重复零次或更多次   例如:a*匹配零个或者多个a
    
  • 重复一次或更多次   例如:a+匹配一个或者多个a
    

? 重复零次或一次 例如:a?匹配零个或者一个a
{n} 重复n次 例如:a{4}匹配4个a
{n,} 重复n次或更多次 例如:a{4,}匹配至少4个a
{n,m} 重复n到m次 例如:a{4,10}匹配4-10个a

(4)字符类

可在方括号里列出想查找的数字,字母或数字,空白字符等。

(5)分枝条件

相当于逻辑关系中的或关系,有多个分支,只需要一个分支符合即可,分支间使用‘|’符号隔开。

(6)反义

匹配不在字符类指定范围内的字符。

(7)分组

用括号括住来实现分组捕获,如/.+(\d+).+/捕获字符串中的所有数字部分,然后通过组号就可以抽取出各分组匹配的字符文本或者通过反向引用的方式对分组中的文本进行替换。

(8)后向引用

后向引用用于重复搜索前面某个分组匹配的文本。

(9)贪婪与懒惰

贪婪匹配:正则表达式一般趋向于最大长度匹配;懒惰匹配:就是匹配到结果就好,就少的匹配字符。

具体的测试代码:

public class RegexTest extends TestCase{

	@Test
	public void testMatches(){
		//元字符
		assertEquals(true, "CQB".matches("\\w.\\w")); //.表示除了换行符之外任意一个字符
		assertEquals(true, "1258".matches("\\d+")); //匹配1个或更多连续的数字
		assertEquals(true, "0792-69831245".matches("0\\d{3}-\\d{8}"));//匹配4位区号+8位电话号码
		assertEquals(true, "quit".matches("\\bq\\w*\\b"));//匹配以字母q开头的字符串
		assertEquals(true, "apple".matches("\\b\\w{5}\\b"));//匹配长度位5个字符的字符串
		assertEquals(true, "75875832532".matches("^\\d{5,12}$"));//^和$代表分别代表行的开始和结束,重复5~12次

		//字符转义
		assertEquals(true, "Q*N".matches("\\w\\*\\w"));//要查找*,需要用\*
		assertEquals(true, "Q\\N".matches("\\w\\\\\\w"));//要查找\,需要用\\
		assertEquals(true, "Q.N".matches("\\w\\.\\w"));//要查找.,需要用\.
		
		//重复
		assertEquals(true, "qi".matches("qi*")); //*:重复零次或更多次
		assertEquals(true, "qiiiiii".matches("qi*"));//*:重复零次或更多次
		assertEquals(true, "QQ20145226".matches("QQ\\d+"));//+:重复一次或更多次
		assertEquals(true, "qqqqq".matches("q{5}"));//{n}:重复n次
		assertEquals(true, "qqq".matches("q{2,}"));//{n,} 重复n次或更多次
		assertEquals(true, "qqqqqqqq".matches("q{6,9}"));//{n,m} 重复n到m次

		//字符类:在方括号里列出想查找的数字,字母或数字,空白字符等
		assertEquals(true, "q".matches("[quit]"));//匹配[]内的字母或符号
		assertEquals(true, "m".matches("[a-z]"));//匹配[ - ]给出的字母或数字范围
		assertEquals(true, "(0792)69831245".matches("\\(?0\\d{3}[) -]?\\d{8}"));//(1个0,3个数字\d{2})或-或空格出现1次或不出现,八个数字\d{8}。

		//分枝条件
		assertEquals(true, "0792-6983124".matches("0\\d{2}-\\d{8}|0\\d{3}-\\d{7}"));//匹配三个数字-八个数字,或者四个数字-七个数字
		assertEquals(true, "079-69831245".matches("\\(?0\\d{2}\\)?[- ]?\\d{8}|0\\d{2}[- ]?\\d{8}|\\(?0\\d{3}\\)?[- ]?\\d{7}|0\\d{3}[- ]?\\d{7}"));
		assertEquals(true, "2".matches("((1|0?)[0-9]|[1-9][0-9])"));

		//分组
		assertEquals(true, "121.353.678.999".matches("(\\d{1,3}\\.){3}\\d{1,3}"));//匹配每三个数字加一个小数点,共12个数字
		assertEquals(true, "219.241.20.3".matches("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"));//匹配正确的ip地址

		//反义
		assertEquals(true, "adef".matches("\\S+"));//匹配任意不是空白符的字符
		assertEquals(false, "12aaa".matches("\\D+"));//匹配任意非数字的字符
		assertEquals(false, "xxerey".matches("[^xy]"));//匹配除了[]内字符以外的任意字符
		assertEquals(true, "<quit>".matches("<q[^>]+>"));//匹配用尖括号括起来的以a开头的字符串

		//后向引用
		assertEquals(true, "cheers cheers".matches("\\b(\\w+)\\b\\s+\\1\\b"));//匹配重复的单词
		assertEquals(true, "cheers cheers".matches("\\b(?<bang>\\w+)\\b\\s+\\k<bang>\\b"));//指定组名

		//贪婪与懒惰
		assertEquals(true, "qcbai".matches("q.*i"));//贪婪,匹配最长的以q开始,以i结束的字符串
		assertEquals(true, "qcbai qci qqwai".matches("q.*i"));
		assertEquals(true, "qcbai".matches("q.*?i"));//懒惰,匹配最短的,以q开始,以i结束的字符串
	}
}

运行后的结果为:

posted @ 2017-06-04 21:49  夏艺华20145226  阅读(1151)  评论(0编辑  收藏  举报