《XML与正则表达式.ppt》由会员分享,可在线阅读,更多相关《XML与正则表达式.ppt(15页珍藏版)》请在三一办公上搜索。
1、第8章 XML与正则表达式,正则表达式(Regular Expression)处理文本和模式匹配问题实用、高效,因此XML也引入了对正则表达式的支持。本章将着重讲述正则表达式在XML中的应用。,8.1 正则表达式在XML中的应用,正则表达式可以用于指定字符串模式。在XML范畴内,主要使用在以下几个方面。XML Schema XPath 2.0 XSLT 2.0,8.1.1 在XML Schema中的应用,正则表达式可以在验证时,指定字符串匹配模式。以下示例代码演示了正则表达式的使用。上面的代码定义了一个匹配模式“a-z30-93”。以下代码所示的元素可以通过验证。abc123,8.1.2 在X
2、Path 2.0中的应用,正则表达式可以用于XPath 2.0中三个函数matches(),replace()和tokenize()。以下XSLT代码中使用了这三个函数。代码说明:matches(2007-03-01,d4-d2-d2)将返回true。replace(2007-03-01,(d4)-(d2)-(d2),$2/$3/$1)将返回字符串“03/01/2007”。tokenize(2007-03-01,-)将返回序列(2007,03,01)。,8.1.3 在XSLT 2.0中的应用,正则表达式在XSLT 2.0的应用主要是在元素中。以下示例代码演示了正则表达式在该元素中的使用。non
3、-letter,8.2 XML正则表达式简介,许多编程语言都支持正则表达式。尽管这些语言中的正则表达式基本结构一样,但是其语法并不完全相同。XML正则表达式与Perl中正则表达式十分相似。事实上,XML正则表达式正是以Perl正则表达式为蓝本来定义的。本节将简要讲述XML正则表达式的基本语法结构。,8.2.1 元字符和普通字符,正则表达式的定义是以字符为基本单位的。字符又可以分为元字符和普通字符两类。元字符是指在正则表达式中表示特殊含义的字符。元字符包括“.”、“”、“?”、“*”、“+”、“|”、“”、“”、“”、“$”、“”、“”。普通字符是指除元字符外的所有Unicode字符。普通字符匹
4、配其本身,当然如果在使用时,flags标志含有“i”,那么普通字符还可以匹配其大写或小写形式。元字符中的“.”用于匹配任何单字符(除换行符外)。当flags标志含有“s”时,“.”将匹配包括换行符在内的所有字符。元字符“”和“$”用于匹配输入字符串的开始和结束。默认情况下,这里的开始和结束是指整个字符串的开头和结尾。当flags标志含有“m”时,整个字符串在换行符处,被看做一行的结束,在换行符的下个字符处,看做另一行的开始。例如,正则表达式“The”,可匹配字符串“The”;正则表达式“doc$”,匹配字符串“doc”。,8.2.2 量词,量词用来指定字符出现次数。量词的形式主要有“?”、“*
5、”、“+”、“”。元字符“?”作为量词出现,用来匹配0个或1个字符。例如A?,表示0个或一个字符“A”。元字符“*”作为量词出现,用来匹配0个或多个字符。例如A*,表示0个或多个字符“A”。元字符“+”作为量词出现,用来匹配1个或多个字符。例如A+,表示1个或多个字符“A”。元字符“”和“”作为量词出现,用来匹配指定个数的字符,其形式有三种情况。,8.2.3 字符转义与字符类,元字符在正则表达式中有特殊含义。如果需要使用其原义,则需要用到字符转义。字符转义使用字符“”来实现。其语法模式为:“”+元字符。例如,“.”表示普通字符“.”;“.xml”匹配字符串“.xml”;而普通字符“”需要使用“
6、”来表示。字符类是可选的字符集合。字符转义是实现字符类的一种模式。字符转义实现的字符类可以分为两类,一类为单字符匹配,另一类为多字符匹配。单字符匹配是指字符集合中仅含有一个字符,而多字符匹配是指字符集合中含有多个字符。,单字符匹配有以下几种。“n”,用于匹配换行符(x0A)。“r”,用于匹配回车符(x0D)。“t”,用于匹配制表符(x09)。元字符“.”、“”、“?”、“*”、“+”、“|”、“”、“”、“”、“$”、“”、“”可加分别加前缀字符“”来实现转义,表示字符本身。多字符匹配有以下几种。“s”,用于匹配空白符。正如前面所说,空白符包括空格(x20)、制表符(x09)、回车符(x13)
7、、换行符(x0A)。“i”,用于匹配可作为XML元素和属性名称中第一个字符的字符。包括所有的字母字符、“:”和“_”。例如,matches(_,i)将返回true,而maches(?,i)将返回false。“c”,用于匹配可作为XML命名规范的字符,或者说可用于XML元素或属性名称的字符。例如,matches(.,c)将返回true,而matches(,c)将返回false。“d”,用于匹配数字。例如,matches(1,d)将返回true,而matches(a,d)将返回false。“w”,用于匹配可用作组成单词的字符。例如,matches(Z,w)将返回true,而matches(?,d)
8、将返回false。,以上字符类均为XML正则表达式内置的字符集合。除此之外,还可以使用“”来自定义字符类。例如,az可用于匹配字符a或z,a-z用于匹配字符“a”到字符“z”的任意字符,a-z0-9用于匹配字符“a”到字符“z”或字符“0”到字符“9”中的任意字符。“”实际上定义了某个范围内的字符。如果需要表示该范围之外的字符集合,可以使用字符“”。例如,az可用于表示除“a”到“z”之外的所有Unicode字符。需要注意,这里的“”与行首匹配符“”的区别。行首匹配符必须出现在正则表达式的开头,而表示补集的“”必须出现在“”之内。,8.2.4 字符组的使用,XML的正则表达式中还可以利用“()
9、”来对正则表达式分组。可以使用量词来修饰分组,这极大地扩展了正则表达式的功能。例如,“Hello,Hello,World”可以匹配正则表达式“(Hello,)2”。在XPath的函数中可以使用$1、$2、$3$n来引用与相应分组匹配的字符串。例如,replace(1234dd,(d4)(w2),$2$1)将返回字符串“dd1234”。在XSLT 2.0元素中,可以利用函数regex-group()来引用分组。以下代码为一个示例程序片段。,8.2.5 正则表达式分支,可以利用“|”来创建多个正则表达式分支。例如,“d4|w4”可以看做两个正则表达式“d4”和“w4”,匹配其中任何一个正则表达式的
10、字符串都被认为匹配整个正则表达式。如果该字符串两个正则表达式分支都匹配,那么将被处理为匹配第一个正则表达式分支。,小结,本章讲述了XML正则表达式的基础知识。XML正则表达式是基于Perl正则表达式的原型,但跟Perl的正则表达式又不完全相同。尤其要注意的是XML正则表达式增加了两个自己的字符类“i”和“c”。XML正则表达式可用于XML Schema、Xpath 2.0和XSLT 2.0。对于Xpath 2.0和XSLT 2.0来说,虽然只有少数几个函数和元素,但是却极大地扩展了XML的功能。Xpath 1.0和XSLT 1.0并不支持正则表达式。量词的匹配,默认遵循贪婪原则,但需要注意如何将其转化为非贪婪。,上机指导,实验一:使用正则表达式获取指定元素所有属性的集合。实验二:采用JS正则表达式验证XML文件结构。实验三:JS正则表达式判断是否为数字。,