收藏本站 收藏本站
积木网首页 - 软件测试 - 常用手册 - 站长工具 - 技术社区
首页 > 正则表达式 > 正文

首页 - PHP - 数据库 - 操作系统 - 游戏开发 - JS - Android - MySql - Redis - MongoDB - Win8 - Shell编程 - DOS命令 - jQuery - CSS样式 - Python - Perl

Access - Oracle - DB2 - SQLServer - MsSql2008 - MsSql2005 - Sqlite - PostgreSQL - node.js - extjs - JavaScript vbs - Powershell - Ruby

正则表达式教程之元字符的使用详解

本文实例讲述了正则表达式教程之元字符的使用。分享给大家供大家参考,具体如下:

注:在所有例子中正则表达式匹配结果包含在源文本中的【和】之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。

一、对特殊字符进行转义

元字符是一些在正则表达式里有着特殊含义的字符。因为元字符在正则表达式里有着特殊的含义,所以这些字符就无法用来代表它们本身。在元字符前面加上一个反斜杠就可以对它进行转义,这样得到的转义序列将匹配那个字符本身而不是它特殊的元字符含义。如,如果想要匹配[和],就必须对它进行转义:


对元字符转义需要用到斜杠字符,这就意味着字符本向也是一个元字符,要匹配字符本身,必须转义成\。如匹配windows文件路径。

二、匹配空白字符

元字符大致可以分为两种:一种是用来匹配文本的(如.),另一种是正则表达式的语法所要求的(如[和])。

在进行正则表达式搜索的时候,我们经常会遇到需要对原始文本中里的非打印空白字符进行匹配的情况。比如说,我们可能需要把所有的制表符找出来,或者我们需要把换行符找出来,这类字符很难被直接输入到一个正则表达式里,这时我们可以使用如下列出的特殊元字符来输入它们:

b 回退(并删除)一个字符(Backspace键) f 换页符 n 换行符 r 回车符 t 制表符(Tab键) v 垂直制表符

来看一个例子,把文件中的空白行去掉:

文本:

8 5 4 1 6 3 2 7 9
7 6 2 9 5 8 3 4 1
9 3 1 4 2 7 8 5 6

6 9 3 8 7 5 1 2 4
5 1 8 3 4 2 6 9 7
2 4 7 6 1 9 5 3 8

3 26 7 8 4 9 1 5
4 8 9 5 3 1 7 6 2
1 7 5 2 9 6 4 8 3

正则表达式:rnrn

分析:rn匹配一个回车+换行组合,windows操作系统中把它作为文本行的结束标签。使用正则表达式rnrn进行的搜索将匹配两个连续的行尾标签,而这正好是空白行。

注意:Unix和Linux操作系统中只使用一个换行符来结束一个文本行,换句话说,在Unix或Linux系统中匹配空白行只使用nn即可,不需要加上r。同时适用于windows和Unix/Linux的正则表达式应该包括一个可先的r和一个必须匹配的n,即r?nr?n,这将会在后面的文章中讲到。

Java代码如下:

public static void matchBlankLine() throws Exception{
  BufferedReader br = new BufferedReader(new FileReader(new File("E:/九宫格.txt")));
  StringBuilder sb = new StringBuilder();
  char[] cbuf = new char[1024];
  int len = 0;
  while(br.ready() && (len = br.read(cbuf)) > 0){
    br.read(cbuf);
    sb.append(cbuf, 0, len);
  }
  String reg = "rnrn";
  System.out.println("原内容:n" + sb.toString());
  System.out.println("处理后:-----------------------------");
  System.out.println(sb.toString().replaceAll(reg, "rn"));
}

运行结果如下:

原内容:

8 5 4 1 6 3 2 7 9
7 6 2 9 5 8 3 4 1
9 3 1 4 2 7 8 5 6

6 9 3 8 7 5 1 2 4
5 1 8 3 4 2 6 9 7
2 4 7 6 1 9 5 3 8

3 2 6 7 8 4 9 1 5
4 8 9 5 3 1 7 6 2
1 7 5 2 9 6 4 8 3

 
处理后:-----------------------------

8 5 4 1 6 3 2 7 9
7 6 2 9 5 8 3 4 1
9 3 1 4 2 7 8 5 6
6 9 3 8 7 5 1 2 4
5 1 8 3 4 2 6 9 7
2 4 7 6 1 9 5 3 8
3 2 6 7 8 4 9 1 5
4 8 9 5 3 1 7 6 2
1 7 5 2 9 6 4 8 3

三、匹配特定的字符类别

字符集合(匹配多个字符中的某一个)是最常见的匹配形式,而一些常用的字符集合可以用特殊元字符来代替。这些元字符匹配的是某一类别的字符(类元字符),类元字符并不是必不可少的,因为可以通过逐一列举有关字符或通过定义一个字符区间来匹配某一类字符,但是使用它们构造出来的正则表达式简明易懂,在实际应用中很常用。

1、匹配数字与非数字

d 任何一个数字,等价于[0-9]或[0123456789]
D 任何一个非数字,等价于[^0-9]或[^0123456789]

2、匹配字母和数字与非字母和数字

字母(A-Z不区分大小写)、数字、下划线是一种常用的字符集合,可用如下类元字符:

w 任何一个字母(不区分大小写)、数字、下划线,等价于[0-9a-zA-Z_]
W 任何一个非字母数字和下划线,等价于[^0-9a-zA-Z_]

3、匹配空白字符与非空白字符

s 任何一下空白字符,等价于[fnrtv]
S 任何一下空白字符,等价于[^fnrtv]

注意:退格元字符b没有不在s的范围之内。

4、匹配十六进制或八进制数值

十六进制:用前缀x来给出,如:x0A对应于ASCII字符10(换行符),其效果等价于n。
八进制:用前缀来给出,数值本身可以是两位或三位数字,如:11对应于ASCII字符9(制表符),其效果等价于t。

四、使用POSIX字符类

POSIX字符类是很多正则表达式实现都支持的一种简写形式。Java也支持它,但JavaScript不支持。POSIX字符如下所示:

[:alnum:] 任何一个字母或数字,等价于[a-zA-Z0-9] [:alpha:] 任何一个字母,等价于[a-zA-Z] [:blank:] 空格或制表符,等价于[t] [:cntrl:] ASCII控制字符(ASCII 0到31,再加上ASCII 127) [:digit:] 任何一个数字,等价于[0-9] [:graph:] 任何一个可打印字符,但不包括空格 [:lower:] 任何一个小写字母,等价于[a-z] [:print:] 任何一个可打印字符 [:punct:] 既不属于[:alnum:]和[:cntrl:]的任何一个字符 [:space:] 任何一个空白字符,包括空格,等价于[^fnrtv] [:upper:] 任何一个大写字母,等价于[A-Z] [:xdigit:] 任何一个十六进制数字,等价于[a-fA-F0-9]

POSIX字符和之前见过的元字符不太一样,我们来看一个前面利用正则表达式来匹配网页中的颜色的例子:

文本:<span style="background-color:#3636FF;height:30px;width:60px;">测试</span>

正则表达式:#[[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]] [[:xdigit:]]

结果:<span style="background-color:【#3636FF】;height:30px;width:60px;">测试</span>

注意:这里使用的模式以[[开头、以]]结束,这是使用POSIX字符类所必须的,POSIX字符必须括在[:和:]之间,外层[和]字符用来定义一个集合,内层的[和]字符是POSIX字符类本身的组成部分。

在java中的POSIX字符表示有所不同,不是包括在[:和:]之间,而是以p开头,包括在{和}之间,且大小写有区别,同时增加了p{ASCII},如下所示:

p{Alnum} 字母数字字符:[p{Alpha}p{Digit}] p{Alpha} 字母字符:[p{Lower}p{Upper}] p{ASCII} 所有 ASCII:[x00-x7F] p{Blank} 空格或制表符:[ t] p{Cntrl} 控制字符:[x00-x1Fx7F] p{Digit} 十进制数字:[0-9] p{Graph} 可见字符:[p{Alnum}p{Punct}] p{Lower} 小写字母字符:[a-z] p{Print} 可打印字符:[p{Graph}x20] p{Punct} 标点符号:!"#$%&'()*+,-./:;<=>?@[]^_`{|}~ p{Space} 空白字符:[ tnx0Bfr] p{Upper} 大写字母字符:[A-Z] p{XDigit} 十六进制数字:[0-9a-fA-F]

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:
http://tools.gimoo.net/regex/javascript

正则表达式在线生成工具:
http://tools.gimoo.net/regex/create_reg

希望本文所述对大家正则表达式学习有所帮助。

正则表达式教程之重复匹配详解
本文实例讲述了正则表达式教程之重复匹配。分享给大家供大家参考,具体如下:注:在所有例子中正则表达式匹配结果包含在源文本中的【和】之间

正则表达式教程之位置匹配详解
本文实例讲述了正则表达式教程之位置匹配。分享给大家供大家参考,具体如下:注:在所有例子中正则表达式匹配结果包含在源文本中的【和】之间

正则表达式教程之子表达式用法分析
本文实例讲述了正则表达式教程之子表达式用法。分享给大家供大家参考,具体如下:注:在所有例子中正则表达式匹配结果包含在源文本中的【和】

本周排行

更新排行

强悍的草根IT技术社区,这里应该有您想要的! 友情链接:b2b电子商务
Copyright © 2010 Gimoo.Net. All Rights Rreserved  京ICP备05050695号