Chinaunix首页 | 论坛 | 博客
  • 博客访问: 334849
  • 博文数量: 329
  • 博客积分: 2633
  • 博客等级: 少校
  • 技术积分: 3633
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-22 15:43
文章分类

全部博文(329)

文章存档

2013年(244)

2012年(46)

2011年(39)

我的朋友

分类: 系统运维

2012-03-21 13:15:11

入门看:正则表达式30分钟入门

精通看:精通正则表达式

 

1.以下是正则表达式的常用的:

特殊字符

作用

示例

.

匹配所有字符、空格、Tab键(可以是多个字符)。除了换行符号之外的任何字符。

a.b  匹配:abbahhhba b

[]

匹配包含在其中的单个字符

hel[opm] 匹配:helo help helm

()

匹配一组表达式,该表达式可以由其它特殊字符组成

t([aop]a)p 匹配:taaptoaptpap

|

或的表达式

t(a|o|pk)p   匹配:taptoptpkp

*

匹配0次或多次,只对邻近的字符或一组表达式起作用

ab*  匹配:a abb

+

匹配1次或多次,只对邻近的字符或一组表达式其作用

ab+  匹配:ababb等但不匹配a

匹配1次或一次也没有,只对邻近的字符或一组表达式起作用

ab?   匹配:a ab但不匹配abb

{n}

匹配指定的次数,n是一个数字,只对邻近的字符或一组表达式起作用

ab{2}c 匹配:abbcaabbcc,但不匹配abc

{n,m}

匹配指定的次数,从n次到m次,只对邻近的字符或一组表达式起作用

ab{2,3}c 匹配:abbcabbbc,但不匹配abc

*?

重复任意次,但尽可能少重复

 

+?

重复1次或更多次,但尽可能少重复

 

??

重复0次或1次,但尽可能少重复

 

{n,m}?

重复nm次,但尽可能少重复

 

{n,}?

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

 

^

否的表达式,表示不想被匹配的字符,一般和[]一起使用。也匹配输入字符串的开始。

a^b^cd 匹配:addaed等,但不匹配abdacd

$

匹配输入字符串的结束位置

^a[^b^c]d$

-

连字符表示一个范围

09]匹配123

\b

单词的开头或结尾,也就是单词的分界处

 

 

 

 

\d

等价于[0~9],匹配单个数字

\dabc  匹配:1abc2abc等,但不匹配1abc2abc

\D

等价于[^0~9],不匹配单个数字

\Dabc  匹配:aabcbabc、等,但不匹配1abc2abc   

\w

匹配字母或数字或下划线或汉字。等价于[A~Z0~9],匹配单个数字或单个英文字母

\wabc 匹配:aabcbabc等,但不匹配!abc#abc

\f

匹配一个换页符

 

\n

匹配一个换行符

 

\r

匹配一个回车符

 

\t

匹配一个制表符

 

\v

匹配一个垂直制表符

 

\s

匹配任意的空白符。等价于[\f\n\r\t\v],匹配一个换页符、换行符、回车符、制表符、垂直制表符

等价于[\f\n\r\t\v]

\S

等价于[^\f\n\r\t\v],匹配一个非空白字符

等价于[^\f\n\r\t\v]

\

转义符,将特殊字符转化为普通字符

\\\-\^\*   匹配:\-^*

 

2.常用分组语法:

分类

代码/语法

说明

捕获

(exp)

匹配exp,并捕获文本到自动命名的组里

(?exp)

匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)

(?:exp)

匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言

(?=exp)

匹配exp前面的位置。零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp

(?<=exp)

匹配exp后面的位置。零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp

(?!exp)

匹配后面跟的不是exp的位置。零宽度负预测先行断言(?!exp)断言此位置的后面不能匹配表达式exp

(?

匹配前面不是exp的位置。(?,零宽度正回顾后发断言断言此位置的前面不能匹配表达式exp

注释

(?#comment)

这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

 

 

3.尚未详细讨论的语法:

代码/语法

说明

\e

Escape

\0nn

ASCII代码中八进制代码为nn的字符

\xnn

ASCII代码中十六进制代码为nn的字符

\unnnn

Unicode代码中十六进制代码为nnnn的字符

\cN

ASCII控制字符。比如\cC代表Ctrl+C

\A

字符串开头(类似^,但不受处理多行选项的影响)

\Z

字符串结尾或行尾(不受处理多行选项的影响)

\z

字符串结尾(类似$,但不受处理多行选项的影响)

\G

当前搜索的开头

\p{name}

Unicode中命名为name的字符类,例如\p{IsGreek}

(?>exp)

贪婪子表达式

(?-exp)

平衡组

(?im-nsx:exp)

在子表达式exp中改变处理选项

(?im-nsx)

为表达式后面的部分改变处理选项

(?(exp)yes|no)

exp当作零宽正向先行断言,如果在这个位置能匹配,使用yes作为此组的表达式;否则使用no

(?(exp)yes)

同上,只是使用空表达式作为no

(?(name)yes|no)

如果命名为name的组捕获到了内容,使用yes作为表达式;否则使用no

(?(name)yes)

同上,只是使用空表达式作为no

 

4.正则表达式在java中的应用

java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现。

1).共分三步:

①构造一个模式.

Pattern p=Pattern.compile("[a-z]*");

②建造一个匹配器

Matcher m = p.matcher(str);

③进行判断,得到结果

boolean b = m.matches()

2).Matcher类提供三个匹配操作方法,三个方法均返回boolean类型,当匹配到时返回true,没匹配到则返回false

m.matches()

matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true

m.lookingAt()

lookingAt()对前面的字符串进行匹配,只有匹配到的字符串在最前面才返回true

m.find()

find()对字符串进行匹配,匹配到的字符串可以在任何位置

3).Matcher类的其他方法

int groupcount() 返回此匹配器模式中的捕获组数。

String replaceAll(String replacement) 用给定的replacement全部替代匹配的部分

String repalceFirst(String replacement) 用给定的replacement 替代第一次匹配的部分

appendReplacement(StringBuffer sb,String replacement) 根据模式用replacement替换相应内容,并将匹配的结果添加到sb当前位置之后

StringBuffer appendTail(StringBuffer sb) 将输入序列中匹配之后的末尾字串添加到sb当前位置之后.

group(n) 0代表永远都是匹配整个表达式的字符串的那部分 n<>0时代表第n组匹配的部分

         4).例子:

①字符匹配

Pattern p = Pattern.compile(expression); // 正则表达式

Matcher m = p.matcher(str); // 操作的字符串

boolean b = m.matches(); //返回是否匹配的结果

System.out.println(b);

Pattern p = Pattern.compile(expression); // 正则表达式

Matcher m = p.matcher(str); // 操作的字符串

boolean b = m. lookingAt (); //返回是否匹配的结果

System.out.println(b);

Pattern p = Pattern.compile(expression); // 正则表达式

Matcher m = p.matcher(str); // 操作的字符串

boolean b = m..find (); //返回是否匹配的结果

System.out.println(b);

②分割字符串

Pattern pattern = Pattern.compile(expression); //正则表达式

String[] strs = pattern.split(str); //操作字符串 得到返回的字符串数组

③替换字符串

Pattern p = Pattern.compile(expression); // 正则表达式

Matcher m = p.matcher(text); // 操作的字符串

String s = m.replaceAll(str); //替换后的字符串

④查找替换指定字符串

Pattern p = Pattern.compile(expression); // 正则表达式

Matcher m = p.matcher(text); // 操作的字符串

StringBuffer sb = new StringBuffer();

int i = 0;

while (m.find()) {

m.appendReplacement(sb, str);

i++; //字符串出现次数

}

m.appendTail(sb);//从截取点将后面的字符串接上

String s = sb.toString();

⑤查找输出字符串

Pattern p = Pattern.compile(expression); // 正则表达式

Matcher m = p.matcher(text); // 操作的字符串

while (m.find()) {

//m.start() 返回匹配到的子字符串在字符串中的索引位置.

//m.end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.

//m.group()返回匹配到的子字符串

}

阅读(982) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~