`

精通java正则表达式

    博客分类:
  • j2se
 
阅读更多

精通java正则表达式

1.正则表达式的作用

 

正则表达式几乎可以处理所有的字符串操作

2.正则表达式的基本使用(一)

 

1) 字符组,

正则表达式的最基本结构之一,规定某个位置能够出现的字符,以[.] 的形式给出,在方括号内列出字符,例如:

 

		String regex2 = "sep[ea]r[ea]te";
		String str2 = "seperate";
 

2) 连字符:

使用连字符范围表示表法(使得描述简要)

[0123456789] = [0-9]

[0-789] = [0-9]

[0123456789abcdef] = [0-9a-f] 

注意:在字符组的内部,只有在连字符出现在两个字符之间时,才能表示字符的范围,如果出现在字符的开头,则只能表示连字符本身“-

3) 排除型字符组

规定某个位置不容许出现的字符,以[ˆ..]表示,在方括号内规定不允许出现的字符,排除型字符,需要匹配一个字符,不能匹配空字符;排除型字符,可以使用一个连字符或者多个连字符之前。例如:

"[^0-5]";

"[^0-5e-f]"

4) 字符组简记法

对于常用的字符组,正则表达式提供了相应的简记法,来方便表示:

\d = [0-9]

\D = [ˆ0-9]

\w=[0-9a-z]

\W=[ˆ0-9a-z]

\s 匹配空白字符(回车、换行、制表、空格)

\S 匹配非空白字符

5) 特殊字符

点号 . 是一个特殊的字符组简记法,它可以匹配几乎所有的字符。\. 表示点号本身,在字符组的内部[.]也只能匹配点号本身;注意:正则表达式的规定,点号不能匹配换行符,(在特点的匹配模式除外)

3.正则表达式的基本使用(二)

 

1) 量词

限定之前字符出现的次数

*  之前的字符出现0次到无穷多次

之前的字符至少出现1

?  之前的字符至多只能出现1

2)区间量词

规定字符出现的次数

形式:

{min,max}

{min,}

{number}

*={0,}

+={1,}

?={0,1}

3) 量词的局限

量词只能规定字符或者字符组出现的次数,如果需要规定一个字符串出现的次数,必须使用(.) ,在括号内填写字符串,在闭括号之后加入量词

4) 括号的用途:多选结构

字符组只能表示某个位置可能出现的单子字符,而不能表示某个位置表示的字符串

表示某个位置可能出现的字符串

形式是:

(.|) ,在竖线两端添加各个字符串

(.|.||)

实例:美化数字,代码如下:

 

/**
	 * @param args
	 */
	public static void main(String[] args) {
		String[] numbers = new String[] { "1234567890", "123456", "123" };
		for (String number : numbers) {
			System.out.print(number + "处理之后:" + beautifyNumber(number) + "");
			System.out.println();
		}
	}
	public static String beautifyNumber(String s) {
		return s.replaceAll("(?<=\\d)(?=((\\d{3})+\\b))", ",");
	}
 

结果如下:

 

1234567890处理之后:1,234,567,890
123456处理之后:123,456
123处理之后:123  

这里先不进行解析,之后学习完环视之后,在进行理解

5)括号的用途:捕获分组

作用:将括号内的子表达式捕获的字符串存放到匹配结果中,供匹配完成后访问

形式:

使用普通的括号(..)

注意:只要使用使用的括号就存在分组;捕获分组按照开括号从左至右的顺序编号,遇到括号嵌套的情况也是如此,例如:

 

在表达式 ((A)(B(C))) 中,存在四个这样的组:

1     2     3      4    
1 ((A)(B(C)))
2 /A
3 (B(C))
4 (C)

组零始终代表整个表达式

如果捕获分组之后存在量词,则匹配结果中,捕获分组保存的是子表达式最后一次匹配的字符串

 

6)不捕获文本的括号

如果表达式很复杂,或者需要处理的文本很长,捕获分组会降低效率

作用:仅仅对用来对表达式分组,而不把捕获的文本存放结果

形式:(?:) 

不是所有的语言都支持,可读性不好,如果效率成为一个严重问题时,则考虑使用不捕获文本的括号

 

7)括号的用途:反向引用

在表达式的某一部分,动态重复之前的子表达式所匹配的文本
形式:(\1)

4.正则表达式的基本使用(三)

 

 

1) 锚点

对匹配的位置进行规定

形式:\b 单词分节符锚点

例如:\bcat\b

注意事项:1) 表示单词分解符,要求一侧是单词字符,另一侧是非单词字符 2)单词字符英文字符,数字字符,对中文不适用;3) 非单词字符指的是各种标点符号和空白字符

例如:

 

String[] strings = new String[] {
				"This sentence contain word cat",
				"This sentence contain word \"cat\"",
				"This sentence contain word vacation",
				"This sentence contain word \"cate\"",
				"中文cat字符",
				"中文cat0",
		};
		String regex = "\\bcat\\b";
		for(String str : strings) {
			System.out.println("Checking sentence:\t" + str);
			Pattern p = Pattern.compile(regex);
			Matcher m = p.matcher(str);
			if(m.find()) {
				System.out.println("Found word \"cat\"!");
			}
			else {
				System.out.println("Can not found word \"cat\"!");
			}
		}

 运行结果如下:

 

Checking sentence:	This sentence contain word cat
Found word "cat"!
Checking sentence:	This sentence contain word "cat"
Found word "cat"!
Checking sentence:	This sentence contain word vacation
Can not found word "cat"!
Checking sentence:	This sentence contain word "cate"
Can not found word "cat"!
Checking sentence:	中文cat字符
Can not found word "cat"!
Checking sentence:	中文cat0
Can not found word "cat"!
 

 

ˆ(托字符表示行的开头 (在不同的匹配模式下有可能变化)

$ 表示 行的结尾 (在不同的匹配模式下有可能变化)

\A 表示整个字符串的开头

\Z 匹配整个字符串的结尾

示例代码如下:

 

		String[] strings = new String[] { "start ", " start  ", " end ", " end" };
		String[] regexes = new String[] { "^start", "\\Astart", "end$", "end\\Z"};
		for (String str : strings) {
			for (String regex : regexes) {
				Pattern p = Pattern.compile(regex);
				Matcher m = p.matcher(str);
				if(m.find()) {
					System.out.println("\"" + str
							+ "\" can be matched with regex \"" + regex
							+ "\"");
				}
				else {
					System.out.println("\"" + str
							+ "\" can not be matched with regex \"" + regex
							+ "\"");
				}
			}
			System.out.println("");
		}
 

运行结果如下:

 

"start " can be matched with regex "^start"
"start " can be matched with regex "\Astart"
"start " can not be matched with regex "end$"
"start " can not be matched with regex "end\Z"

" start  " can not be matched with regex "^start"
" start  " can not be matched with regex "\Astart"
" start  " can not be matched with regex "end$"
" start  " can not be matched with regex "end\Z"

" end " can not be matched with regex "^start"
" end " can not be matched with regex "\Astart"
" end " can not be matched with regex "end$"
" end " can not be matched with regex "end\Z"

" end" can not be matched with regex "^start"
" end" can not be matched with regex "\Astart"
" end" can be matched with regex "end$"
" end" can be matched with regex "end\Z"
 

2) 环视

锚点对位置的判断不够明确

作用:应用子表达式,对位置进行判断

形式:

(?=子表达式)  肯定顺序环视 ,右侧文本能够由子表达式匹配

(?!子表达式)  否定顺序环视,右侧文本不能够由子表达式匹配

(?<子表达式) 肯定逆序环视,左侧文本能够由子表达式匹配

(?<!子表达式) 否定逆序环视,左侧文本不能够由子表达式匹配

例如,肯定环视:

 

String[] strings = new String[] { "Jeff", "Jeffrey", "Jefferson"};
		String[] regexes = new String[] { "Jeff", "Jeff(?=rey)", "Jeff(?!rey)"};
		for (String regex : regexes) {
			for (String str : strings) {
				Pattern p = Pattern.compile(regex);
				Matcher m = p.matcher(str);
				if(m.find()) {
					System.out.println("\"" + str
							+ "\" can be matched with regex \"" + regex
							+ "\"");
				}
				else {
					System.out.println("\"" + str
							+ "\" can not be matched with regex \"" + regex
							+ "\"");
				}
			}
			System.out.println("");
		}
 

运行的结果如下:

 

"Jeff" can be matched with regex "Jeff"
"Jeffrey" can be matched with regex "Jeff"
"Jefferson" can be matched with regex "Jeff"

"Jeff" can not be matched with regex "Jeff(?=rey)"
"Jeffrey" can be matched with regex "Jeff(?=rey)"
"Jefferson" can not be matched with regex "Jeff(?=rey)"

"Jeff" can be matched with regex "Jeff(?!rey)"
"Jeffrey" can not be matched with regex "Jeff(?!rey)"
"Jefferson" can be matched with regex "Jeff(?!rey)"

 

否定环视:

 

String[] strings = new String[] {"see", "bee", "tee"};
		String[] regexes = new String[] { "(?<=s)ee", "(?<!s)ee"};
		for (String regex : regexes) {
			for (String str : strings) {
				Pattern p = Pattern.compile(regex);
				Matcher m = p.matcher(str);
				if(m.find()) {
					System.out.println("\"" + str
							+ "\" can be matched with regex \"" + regex
							+ "\"");
				}
				else {
					System.out.println("\"" + str
							+ "\" can not be matched with regex \"" + regex
							+ "\"");
				}
			}
		}
 

运行结果如下:

 

"see" can be matched with regex "(?<=s)ee"
"bee" can not be matched with regex "(?<=s)ee"
"tee" can not be matched with regex "(?<=s)ee"
"see" can not be matched with regex "(?<!s)ee"
"bee" can be matched with regex "(?<!s)ee"
"tee" can be matched with regex "(?<!s)ee"
 

环视的使用注意事项:1) 环视结构仅仅用于布尔判断,结构内的子表达式所匹配的文本,不会保存在整个表达式的结果中 2) 逆序环视结构对子表达式存在限制:限制如下:

Perl,Python:逆序环视结构中的子表达式必须为固定长度

PHP,JAVA :逆序环视结构中的子表达式可以不为固定长度,但是必须具有上线,所以不能为使用*,+ 这样的量词

.NET :逆序环视结构中的子表达式可 完全没有限制

通过环视的学习,就可以完全理解上面例子中: 将 123456789 转换成123,456,789 的正则表达式了

5.正则表达式的基本使用(四)

 

1) 匹配模式

作用:改变某些结构的匹配规则

形式:

I:  Case Insensitive 

S:  SingleLine(dot All)

M: MultiLine 

X: Comment

2) 不区分大小写模式

String regex = "ABC";

Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE)

 

String str = "abc";
		String regex = "ABC";
		Pattern p = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);//
		Matcher m = p.matcher(str);
		if(m.find()) {		
			System.out.println("\"" + str
					+ "\" can be matched with regex \"" + regex
					+ "\"");
		} else {
			System.out.println("\"" + str
					+ "\" can not be matched with regex \"" + regex
					+ "\"");
		}
 

 

运行结果如下:

 

 写道
"abc" can be matched with regex "ABC"
 

 

3) 单行模式 (点号通配模式)

String regex = "<a href=([^>]+)>.*</a>";

Pattern p = Pattern.compile(regex,Pattern.DOTALL);//

在默认情况在点号,不能匹配换行,但是使用在以上模式下点号可以匹配换行

 

String str = "<a href=www.itcast.net>\nITCAST\n</a>";
		String regex = "<a href=([^>]+)>.*</a>";
		Pattern p = Pattern.compile(regex);//
		Matcher m = p.matcher(str);
		if(m.find()) {		
			System.out.println("\"" + str
					+ "\" can be matched with regex \"" + regex
					+ "\"");
		} else {
			System.out.println("\"" + str
					+ "\" can not be matched with regex \"" + regex
					+ "\"");
		}

 

 运行结果如下:

 

"<a href=www.itcast.net>
ITCAST
</a>" can not be matched with regex "<a href=([^>]+)>.*</a>"
 

 

4) 多行模式

用来修改ˆ(托字符$匹配模式,可以匹配字符串内部各行的开头和结束的位置

\A 和\Z 不受影响

String regex = "^ITCAST$";

Pattern p = Pattern.compile(regex,Pattern.MULTILINE);//

 

String str = "<a href=www.itcast.net>\nITCAST\n</a>";
		String regex = "^ITCAST$";
		Pattern p = Pattern.compile(regex,Pattern.MULTILINE);//
		Matcher m = p.matcher(str);
		if (m.find()) {
			System.out.println("\"" + str + "\" can be matched with regex \""
					+ regex + "\"");
		} else {
			System.out.println("\"" + str
					+ "\" can not be matched with regex \"" + regex + "\"");
		}

 

运行结果如下:

"<a href=www.itcast.net>
ITCAST
</a>" can be matched with regex "^ITCAST$"
 

 

5) 注释模式

作用:使用注释模式使得正则表达式内部可以使用注释

注释以#开头,以换行符结尾(或者直到表达式结束)

使用此模式之后,正则表达式会忽略所有的空白字符

String str = "webmaster@itcast.net";
		String regex = "webmaster #username\n" + "@" + "itcast.net #hostname";
		Pattern p = Pattern.compile(regex, Pattern.COMMENTS);//
		Matcher m = p.matcher(str);
		if (m.find()) {
			System.out.println("\"" + str + "\" can be matched with regex \""
					+ regex + "\"");
		} else {
			System.out.println("\"" + str
					+ "\" can not be matched with regex \"" + regex + "\"");
		}

 运行结果如下:

"<a href=www.itcast.net>
ITCAST
</a>" can be matched with regex "^ITCAST$"
 

6) 混合模式

作用:同时使用多个模式

形式:在编译正则表达式时,把表示模式的多个参数以竖线 |  连接起来

String regex = "<a href=([^>]+)>.*</a>";

Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);

7) 模式的作用范围

作用:精确控制模式的作用范围

形式:在表达式中以(?ismx) 的方式启用模式,以(?-ismx)的方式停用模式

如:

String regex = "(?is)<a href=([^>]+)>.*</a>"; 启用i模式

8) 模式冲突

String regex = "(?-i)ABC";

Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);//

以正则表达式中的模式为主

内容有待进一步完善

分享到:
评论

相关推荐

    精通正则表达式(第3版)(含awz3 mobi epub)

    本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者真正“精通”正则表达式。该版对PHP的相关内容、Java1.5和Java1.6的新特性作了可观的扩充讲解。任何有机会使用正则表达式的读者都会从中获益匪浅。

    精通正则表达式中文版英文版_中文版为扫描版

    书中的例子涵盖了多种编程语言,如Perl、Java、JavaScript、.NET等,这些语言的正则表达式引擎虽然大同小异,但在细节上有所区别,学习者将了解到如何在不同环境下应用正则表达式。 对于初学者,书中会引导他们理解...

    精通正则表达式(第三版)简体中文版

    - **Java中的正则表达式**:Java提供了java.util.regex包来支持正则表达式的使用。 - **JavaScript中的正则表达式**:JavaScript的正则表达式对象提供了丰富的功能,包括全局匹配、忽略大小写等选项。 - **.NET框架...

    精通正则表达式(第三版)

    《精通正则表达式(第3版)》主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了在Perl、Java、.NET、PHP中正则表达式的用法。 《精通正则表达式(第3版)》自第1版开始着力于...

    java正则表达式从入门到精通

    在这个“Java正则表达式从入门到精通”的主题中,我们将深入探讨以下几个关键知识点: 1. **正则表达式基础** - **元字符**:如`.`代表任意字符,`^`表示行首,`$`表示行尾,`\d`代表数字,`\w`代表字母或数字等。...

    Java 正则表达式小结

    - 可参考Oracle官方文档或书籍如《精通正则表达式》来深入学习Java正则表达式。 总之,Java正则表达式是处理字符串的强大工具,掌握好正则表达式,能让你在处理文本数据时更加游刃有余。通过不断的实践和学习,你...

    [精通正则表达式(第三版)].(美)佛瑞德.扫描版(modify).pdf

    《精通正则表达式(第三版)》是该领域内的一本经典教材,由精通正则表达式的大师佛瑞德编写。 本书主要针对希望深入学习和掌握正则表达式的读者。书中涵盖了正则表达式的基础知识,同时也深入讲解了正则表达式在不同...

    《精通正则表达式第三版 E文》

    本书第三版涵盖了各种正则表达式引擎的通用特性,包括Perl、Java、JavaScript、.NET、PCRE(Perl兼容正则表达式)等。书中不仅讲解了基本的匹配元素,如字符类、量词、位置锚点,还涉及更高级的主题,如后向引用、...

    [精通正则表达式(第三版)].(美)佛瑞德.扫描版-带详细目录书签.pdf

    在编程语言中,如Python、Java、JavaScript等,正则表达式都是不可或缺的一部分。 该书详细介绍了正则表达式的基本元素,如字符类(如\d表示数字,\w表示字母或数字,\s表示空白字符),量词(*表示零个或多个,+...

    精通正则表达式电子书

    - **Java的深入探讨**:更新了全书内容,特别是增加了对Sun公司的java.util.regex包的深入探讨,这是Java中标准的正则表达式实现。 - **不同版本之间的比较**:书中还包含了对不同语言和工具版本中的正则表达式特性...

    精通正则表达式 中英文

    《精通正则表达式》是系统学习正则表达式的唯一最权威著作。任何时候,任何地方,只要提到正则表达式著作,人们都会提到这本书。该书质量之高,声誉之盛,使得几乎没有人企图挑战它的地位,从而在正则表达式图书领域...

    精通正则表达式(第三版).pdf

    根据提供的信息,我们可以推断出该书《精通正则表达式(第三版)》主要讲述了正则表达式的高级用法及应用技巧。正则表达式作为一种强大的文本处理工具,在多种编程语言中都有着广泛的应用,包括Java、JavaScript等。...

    精通正则表达式(第3版) epub版

    8. **正则表达式库**:书中还讨论了不同编程语言中的正则表达式库,如Java的java.util.regex和Python的re模块,以及如何在这些库中使用正则表达式。 9. **正则表达式设计原则**:最后,作者提出了正则表达式设计的...

    精通正则表达式&正则表达式经典实例

    9. **实例应用**:正则表达式广泛应用于文本编辑器(如vim、emacs)、编程语言(如JavaScript、Python、Java)和搜索引擎(如grep、findstr)。例如,用于验证邮箱格式、手机号码、提取URL等。 通过《精通正则...

    (文字版非扫描)《精通正则表达式 》[美]Jeffrey E·F·Friedl(PDF)

    本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者真正“精通”正则表达式。该版对PHP的相关内容、Java1.5和Java1.6的新特性作了可观的扩充讲解。任何有机会使用正则表达式的读者都会从中获益匪浅。

    [精通正则表达式(第3版)]中文版.(美)Jeffrey.E.F.Friedl-part1.rar

    本书自第1版开始着力于教会读者“以正则表达式来思考”,来让读者真正“精通”正则表达式。该版对PHP的相关内容、Java1.5和Java1.6的新特性作了可观的扩充讲解。任何有机会使用正则表达式的读者都会从中获益匪浅。...

    精通正则表达式(第三版)简体中文.pdf

    5. **正则表达式引擎的差异**:书中讨论了不同的正则表达式引擎(如Perl、JavaScript、Java、.NET等)之间的差异,这对于跨平台开发或使用不同语言的开发者来说非常重要。 6. **实战应用**:书中包含大量实例,涵盖...

    精通正则表达式(第3版) epub格式 带目录 精排极致版 猫头鹰的那本

    本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者真正“精通”正则表达式。该版对PHP的相关内容、Java1.5和Java1.6的新特性作了可观的扩充讲解。任何有机会使用正则表达式的读者都会从中获益匪浅

Global site tag (gtag.js) - Google Analytics