简单入门正则表达式 - 第六章 元字符与修饰符

<style> #content-region { background-image: url(http://p.blog.csdn.net/images/p_blog_csdn_net/rcom10002/EntryImages/20081027/watermark.gif); } #content-region h3 { border: 1px dotted #333333; background-color: #f9f9f9; padding: 10px; font-size: 24px; } #content-region p { font-family: "宋体", "仿宋"; font-size: 16px; line-height: 28px; text-decoration: none; text-indent: 32px; } #content-region .regex-pattern { font-style: oblique; font-family: "Courier New", Courier, monospace; background-color: #FFCCCC; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #FF0000; border-bottom-color: #FF0000; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #FF0000; border-left-color: #FF0000; padding: 0px 5px 0px 5px; } #content-region .regex-result { font-family: "Courier New", Courier, monospace; background-color: #A4FFE1; border-top-style: solid; border-right-style: none; border-bottom-style: solid; border-left-style: none; border-top-color: #339966; border-bottom-color: #339966; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-right-color: #339966; border-left-color: #339966; padding: 0px 5px 0px 5px; } #content-region blockquote { padding: 10px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dotted; border-right-style: dotted; border-bottom-style: dotted; border-left-style: dotted; width: auto; } #content-region img { border: 1px dotted #000000; padding: 16px; background-color: #f9f9f9; margin-top: 16px; margin-right: 16px; margin-bottom: 16px; margin-left: 64px; } #content-region code { white-space: pre; } </style>
简单入门正则表达式 - 第六章 元字符与修饰符

一、使用转义

在接触元字符之前,理解好正则表达式中的转义是非常重要的。在前面的几章中,我们或多或少接触了一些关于转义的内容,在这里,我们再详细地研究一下正则表达式中的转义。

正则表达式中的元字符是具有特定含义的字符。例如“.”,它能够与除了换行符之外的任意字符相匹配;与之类似的还有“?”,表示参与匹配的样式重复零次或一次。既然它们都被赋予了特殊的含义,那么它们就不能再用来与自身相同的普通字符进行匹配了,例如“.”、“)”和“[”就不能直接作为匹配字符而直接使用。

	var myArray = new Array();
	...
	if (myArray[0] == 0) {
	...
	}
	

对于上面的JavaScript代码,我们用正则表达式myArray[0]来匹配数组元素myArray[0],但是结果并不像我们预想的那样,这是因为[0]在正则表达式中是作为字符集合的含义出现,匹配的内容是“0”,而不是“[0]”。所以,正则表达式myArray[0]真正匹配的内容是“myArray0”,而不是我们想要的“myArray[0]”。

既然这样,我们换一个含有转义功能的正则表达式myArray/[0/]再来做一次试验,这次成功匹配了。

简单入门正则表达式 - 第六章 元字符与修饰符

“/”是具有转义作用的元字符,既然是元字符,就不能跟字符“/”相匹配了,但“/”的功能不光是对其他元字符进行转移,就连它自身也可以进行转移,所以,//就能和字符“/”相匹配。字符串“C:/WINDOWS”对应的正则表达式就应该是C://WINDOWS

二、元字符

正则表达式中的原字符分为两大类,一种是参与文本匹配的,比如“.”,另外一种是作为正则表达式语法的一部分而存在,如“?”,“[”和“]”。在实际的应用中,我们将发现有很多这样的原字符,它们是以“空白”元字符开头的。在这里,我们简绍几个常用的正则表达式元字符。

  • /w

    “/w”只能匹配英文字母、数字和下划线。因此,它与元字符“.”并不相同,因为“/w”不能够与符号、标点相匹配。在有些非英语的语言中,“/w”的解释有所不同,它可以与被设置的语言的文字或字母相匹配。如果“/w”的关联文是 Unicode 而非 ASCII,那么它能够匹配到的范围就更为广泛了。

    现在让我们看看“/w”的功能,首先构造正则表达式/w+,然后把字符串“Hello World! 世界你好!”作为测试对象,匹配的结果就是“Hello World! 世界你好!”

  • /W

    “/W”与“/w”匹配的内容相反,只要是/w无法匹配的内容,它都能够进行匹配。也就是说,/W能够匹配那些非字母、数字和下划线的内容。但匹配内容也不是绝对的,还要根据所使用的具体正则引擎而定。

    我们同样以“Hello World! 世界你好!”为例,利用正则表达式/W+匹配的结果就是“HelloWorld!世界你好”。

  • /d

    “/d”能够与数字相匹配,相当于[0-9]的缩写。

    再回顾一下前章电话号码校验的例子,要匹配的字符串为“+086-800-800-8888”,之前构造出来的正则表达式是/+?[0123456789]{2,3}-[0123456789]{3}-[0123456789]{3}-[0123456789]{4},而有了/d,我们就可以把它简化为/+?/d{2,3}-/d{3}-/d{3}-/d{4}。

  • /D

    与“/W”类似,“/d”也有个与之对应的“/D”,它能与数字之外的任意字符相匹配。

三、空白与非空白元字符

  • /s

    我们在进行正则表达式搜索的时候,常常会碰到嵌套在文本里的非打印字符。这些字符有时会极大地干扰我们的查找工作,所以最好是先将它们清除掉。元字符“/s”代表了多种非打印字符。

    符号 含义
    [/b] 退格(Backspace)
    /f 换页符
    /n 换行符
    /r 回车符
    /t 水平制表符
    /v 垂直制表符
  • /S

    与“/d”、“/w”类似,也有一个与“/s”对应的“/S”,它所匹配的内容是非空白字符。

四、使用POSIX字符类

在有些正则表达式引擎中,实现了一种叫做 POSIX 字符类的特殊功能,POSIX 可以简单的看作是常用的字符集合。比如我们常常用 /d表示 0 至 9 之间的数字,/s表示空白字符;而用 POSIX 中的[:alnum:],就能代表正则表达式[A-Za-z0-9],其中的 alnum 是 alphanumeric 的缩写。由此可见,POSIX 是采用了命名的方式来代替使用多个字符集,这样不光能为我们构造正则表达式节省了时间,而且提供了很大方便。因正则表达式引擎的不同,所使用的命名方式也有可能不同,这就要求我们在利用 POSIX 方法构造正则表达式之前先了解所使用的引擎支持的正确的 POSIX 格式。

下面我们在 EmEditor 中用 POSIX 做个小实验。首先查看帮助,看看在 EmEditor 可以使用什么样的 POSIX 语法,下表中列出了所有可用的 POSIX 语法。

Character Classes

The following character classes are used within a character set such as "[:classname:]". For instance, "[[:space:]]" is the set of all whitespace characters.

alnum Any alphanumeric character.
alpha Any alphabetical character a-z, A-Z, and other character.
blank Any blank character, either a space or a tab.
cntrl Any control character.
digit Any digit 0-9.
graph Any graphical character.
lower Any lowercase character a-z, and other lowercase character.
print Any printable character.
punct Any punctuation character.
space Any whitespace character.
upper Any uppercase character A-Z, and other uppercase character.
xdigit Any hexadecimal digit character, 0-9, a-f and A-F.
word Any word character - all alphanumeric characters plus the underscore.
unicode Any character whose code is greater than 255.

简单入门正则表达式 - 第六章 元字符与修饰符

从表格中可以看出[:digit:]的作用与[0-9]完全一样,所以,当从例子的 SQL 语句中查找匹配内容时,16 和 24 被成功的匹配。

五、修饰符

在使用正则表达式时,有时候我们需要使用一些选项来控制匹配的模式。比如我们的表达式是否需要严格地按照字母大小写来进行匹配;表达式是否可以按行为单位来进行工作。 大多数支持正则表达式的编辑器都会提供一个“是否区分大小写”的选项;而在编程语言中,使用正则表达式功能时如果没有特别指定操作选项,结果都是按行为单位返回的。对于修饰符的详细使用我们会在后面的应用章节详细叙述。

简单入门正则表达式 - 第六章 元字符与修饰符

<!-- InstanceEndEditable -->