`

正则表达式入门

    博客分类:
  • Java
 
阅读更多

 

维基百科:http://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F

 

 

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就 是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

元字符:

说明
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

字符转义

如果你想查找元字符本身的话,比如你查找.,或者*, 就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的 特殊意义。因此,你应该使用\.和\*。 当然,要查找\本身,你也得用\\

如何重复

表2.常用的限定符 代码/语法 说明
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次

下面是一些使用重复的例子:

Windows\d+匹配Windows 后面跟1个或更多数字

如何创建IF条件:

\d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编 的规则是5位数字,或者用连字号间隔的9位数字。

如何分组?

可以用小括号来指定子表达式(也叫做分组), 然后你就可以指定这个子表达 式的重复次数了,你也可以对子表达式进行其它一些操作(后面会有介绍)。

(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹 配1到3位的数字,(\d{1,3}\.){3}匹 配三位数字加上一个英文句号(这个整体也就是这个分组)重 复3次,最后再加上一个一到三位的数字(\d{1,3})。

如何!非语句?

.常用的反义代码 代码/语法 说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

如何后向引用?

使用小括号指定一个子表达式后,匹配这个子表达式的文本 (也就是此分组捕获的内容)可以在表达式或其它 程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括 号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本。难以理解?请看示例:

\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词, 也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b), 这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。

你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+)(或者把尖括号换成’也 行:(?’Word’\w+)),这样就把\w+的 组名指定为Word了。要反向引用这个分组捕获的 内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s+ \k<Word>\b。

使用小括号的时候,还有很多特定用途的语法。下面列出了最常用的一些:

 

表4.常用分组语法 分类 代码/语法 说明 捕获 零宽断言 注释
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成 (?’name’exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
(?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
(?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅 读

如何防止无限匹配和提供匹配速度

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多 的 字符。

 

表5.懒惰限定符 代码/语法 说明
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}?

重复n次以上,但尽可能少重复

 

 

举例:

检查变量名定义是否合法的正则表达式:[A-Za-z_][A-Za-z0-9_]*

 

1. Flex中使用

private function validateName(name:String):void {
				var reValidator : RegExpValidator = new RegExpValidator();
				reValidator.expression = "^[A-Za-z_][A-Za-z0-9_]*$";
				reValidator.noMatchError = "wrong";
				var resultEvent : ValidationResultEvent = reValidator.validate(name, true);
				if (resultEvent.type == ValidationResultEvent.INVALID) {
					Alert.show(resultEvent.message);
				} else {
					Alert.show("right");
				}
			}

 

2. Java中使用

public static void main(String[] args) {

		String regex = "[A-Za-z_][A-Za-z0-9_]*";
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher("_hello2012WORLD");

		if (matcher.find()) {
			System.out.println(matcher.group(0));
		}

		if (matcher.matches()) {
			System.out.println("right...");
		} else {
			System.out.println("wrong...");
		}

	}
 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics