分类: 系统运维
2012-03-21 13:15:11
入门看:正则表达式30分钟入门
精通看:精通正则表达式
1.以下是正则表达式的常用的:
特殊字符 |
作用 |
示例 |
. |
匹配所有字符、空格、Tab键(可以是多个字符)。除了换行符号之外的任何字符。 |
a.b 匹配:abb、ahhhb、a b等 |
[] |
匹配包含在其中的单个字符 |
hel[opm] 匹配:helo 、help、 helm |
() |
匹配一组表达式,该表达式可以由其它特殊字符组成 |
t([aop]a)p 匹配:taap、toap、tpap |
| |
或的表达式 |
t(a|o|pk)p 匹配:tap、top、tpkp |
* |
匹配0次或多次,只对邻近的字符或一组表达式起作用 |
ab* 匹配:a 、abb等 |
+ |
匹配1次或多次,只对邻近的字符或一组表达式其作用 |
ab+ 匹配:ab、abb等但不匹配a |
? |
匹配1次或一次也没有,只对邻近的字符或一组表达式起作用 |
ab? 匹配:a 、ab但不匹配abb |
{n} |
匹配指定的次数,n是一个数字,只对邻近的字符或一组表达式起作用 |
ab{2}c 匹配:abbc、aabbcc,但不匹配abc |
{n,m} |
匹配指定的次数,从n次到m次,只对邻近的字符或一组表达式起作用 |
ab{2,3}c 匹配:abbc、abbbc,但不匹配abc |
*? |
重复任意次,但尽可能少重复 |
|
+? |
重复1次或更多次,但尽可能少重复 |
|
?? |
重复0次或1次,但尽可能少重复 |
|
{n,m}? |
重复n到m次,但尽可能少重复 |
|
{n,}? |
重复n次以上,但尽可能少重复 |
|
^ |
否的表达式,表示不想被匹配的字符,一般和[]一起使用。也匹配输入字符串的开始。 |
a[^b^c]d 匹配:add、aed等,但不匹配abd、acd |
$ |
匹配输入字符串的结束位置 |
^a[^b^c]d$ |
- |
连字符表示一个范围 |
[0~9]匹配1、2、3等 |
\b |
单词的开头或结尾,也就是单词的分界处 |
|
|
|
|
\d |
等价于[0~9],匹配单个数字 |
\dabc 匹配:1abc、2abc等,但不匹配1abc,2abc等 |
\D |
等价于[^0~9],不匹配单个数字 |
\Dabc 匹配:aabc、babc、等,但不匹配1abc、2abc等 |
\w |
匹配字母或数字或下划线或汉字。等价于[A~Z0~9],匹配单个数字或单个英文字母 |
\wabc 匹配:aabc、babc等,但不匹配!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,并捕获文本到名称为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) |
贪婪子表达式 |
(? |
平衡组 |
(?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()返回匹配到的子字符串
}