热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

XML先容系列(9)

系列之十七:如何应用XSL和正则表达式来验证数据的有效性XSL现在正在逐渐的成为XML中的类似与SQL在数据库设计中的地位。固然Microsoft'sXSL仅仅是实现了其中的某一些部分的功效但是
系列之十七:如何应用XSL和正则表达式来验证数据的有效性
XSL现在正在逐渐的成为XML中的类似与SQL在数据库设计中的地位。
固然Microsoft's XSL仅仅是实现了其中的某一些部分的功效
但是你已经能够实现非常复杂的查询了
固然现在的XSL仅仅还只是一种基于纯粹文本和字符串方法
的查询语言
在下面先容的例子中,将大批应用到文本内的字符串方法的搜索,
你会发明在XML中对数据的处理很大一部分都是要应用到文本内的查询的。
这在XSL的编写中是一件非常普及的功效。
正是由于这样,你应当懂得一些正则表达式应当如何来应用。

正则表达式的简略先容
正则表达式大部分都是来自与Unix世界的需要。
在Unix中很多编程语言几乎全部都是缭绕着正则表达式进行的(例如Perl, Python, Tcl)
但是令人感到希奇的是正则表达式好象是最近才应用在Windows系列中的,
特别是大批的应用在脚本语言中,例如Javascript和Vbscript,
尽管你也可以将它们应用在Visual Basic或则Java中,但是显然它们似乎在
脚本语言中更加有吸引力。也许是这个缘故把,大家平时似乎都很少应用正则表达式把。

应用正则表达式,你可以根据你想查询的内容建立一个匹配模板(英文叫pattern)
一旦你应用正则表达式建立了一个模板,你就可以应用它来测试你的字符串了,
应用它可以完成很多功效:
例如判定一个字符串是否在另外一个字符串中(或则在另外一个字符串中的什么地位)
例如应用一个字符串来调换另外一个字符串
例如返回所有满足模板条件的字符串列表
例如。。。等等等等

上面我先容了有关正则表达式的基础概念,有关它的具体阐明和语法可以查阅MSDN和
Javascript中的有关帮助。
在VB中假如你想引用正则表达式的话,你需要在项目中引用'Microsoft Vbscript Regular Expressions'。但是假如你要是应用脚本的话就不必要了,由于在脚本里面这已经是一个
内在的对象供你引用了。
当然你需要在你的机器上安装IE4以上罗。
这个对象(在Javascript中)叫RegExp
下面还是让代码来阐明标题把,现在假设你想查看一个文挡里面是否包含一个特定的
字符串(例如'regular expressions')
代码见下:
代码应用VB写成。
Public Function IsTermInDocument(filePath As String,_
expr As String) As Boolean
Dim fs As FileSystemObject
Dim ts As TextStream
Dim re As RegExp
Dim text As String

Set fs = New FileSystemObject
Set ts = fs.OpenTextFile(filePath, ForReading)
text = ts.ReadAll
Set re = New RegExp
re.Pattern = expr
IsTermInDocument = re.Test(text)
End Function

Debug.print IsTermInDocument('c:\bin\myPage.htm',_
'regular expression')
上面的那个函数将根据文挡里面是否有满足条件的字符串返回True/False.
留心我加粗的部分:
第一句是建立一个正则表达式的对象
第二句是指定该正则表达式的模板
第三句就是根据模板履行查询了
呵呵,假如正则表达式的功效仅仅是这么简略的话,也许你会说
VB中的instr()不就能够代替了吗?

但是,在进行XML的数据格局化的时候,对字符串的处理远比这个复杂得多。
例如:假设你要确保你要验证的字段中是否包含一个well-formed的zip编码
(well-formed意味着它是一个有效的编码,
也许它对于某个给定的处所或则区域或则国家又是无效的
这种界于well-formed和valid的表达式将是本文里面讨论的重点)
假如你要是应用VB来进行这种判定的话将非常的丢脸
你需要判定是否表达式有5位或则10位数字,或则是否为字母,
然后第6位字母又必需得是一个破则号
但是假如是应用正则表达式的话,将会是这样的简略:

Set IsZipCode = New RegExp
IsZipCode.Pattern = '^\d{5}(-\d{4})?$'
if IsZipCode.test('32545-2198') then

下面将简略说明一下其中模板的含义:
^ 阐明在这个表达式之前没有任何其它的字符串,
意味着要验证的表达式不是某个字符串中间的一部分,而是它的开头
\d 表现下一个字符必需是0-9中的一个数字
\d{5} 并且必需是连着的5个数字
-\d{4} 4个数字必需呈现在字符'-'的后面
(-\d{4})? 这4个数字是可选的,即可有也可以没有
$ 这个表达式后面应当不会再有其它的什么东西了

最有意思的是一旦你定义好了这么一个模板,你就可以将它应用在
任何其它的正则表达式对象中,而不需要再重新建立一个正则表达式对象了了。
应用这个措施,你甚至可以把一个近2000行代码的Javascript程序
减少到只有几百行,设置当你把一些模板组合在一起的时候,就能够完成
正则表达式本来不可能完成的东东了。

下面我再举一个用来验证数占领效性的例子:
例如你现在想验证一个电话号码数据是否有效
对于通用一个电话号码一般下面这几种写法都是有效的:
(800)555-1212
1(800) 555-1212
1-800-555-1212
1.800.555.1212
等等.

假如你应用脚本来写一段满足上面所有请求的代码将非常的复杂。
但是假如你应用正则表达式的话,将非常的简略,只有下面这两句代码:
Set IsPhOneNumber=new RegExp
IsPhoneNumber.pattern='^[01]?\s*[\(\.-]?(\d{3})[\)\.-]?\s*(\d{3})[\.-](\d{4})$'

你可以仔细领会上面这个代码的意义。
首先它验证第一个字符是否为0或则是否为1或则基本就没有。
然后再进行下面的验证,大家可以自己揣摩其它部分的意思把,呵呵。

查询和调换数据
当然,验证数据的有效性仅仅是它能够做的一件小事而已,
但是更有用的是:假如你能够把上面那么多种电话号码的表达方法转换
成一种同一的方法显示出来。
例如我要把上面的电话号码格局化成XML中的一个片段如下:


123
456
7890


这时的电话号码的模板分成三个部分:
(\d{3}), (\d{3}), (\d{4}), 分辨表现area code, exchange, 和local number
. 在正则表达式中,正则说明器会主动
将匹配的字符赋值给变量 $1, $2, $3,等.
这样你应用下面的代码就能够实现

re.Replace('1(352)351-4159', '$1$2$3')

假如你感到这个Replace应用起来很不舒畅的话,下面将给出一个
类似与VB中的Replace并且扩大了它的函数

Public Function Replacex(sourceStr as String, oldStr as _
String, newStr as String, optional ignoreCase as _
Boolean = False,optional isGlobal as Boolean = True)
Dim re As New RegExp
re.Pattern = oldStr
re.Global = isGlobal
re.IgnoreCase = ignoreCase
Replacex = re.Replace(sourceStr, newStr)
End Function

下面给出应用它的一些例子:
Debug.Print Replacex('This is a test','is','at')
--> 'That at a test'
最出色的还是应用正则表达式了
Debug.Print Replacex('This is a test','\ws','at')
--> 'That at a tatt'
甚至还可以这样
Debug.Print Replacex('This is a test','(\ws)','at$1')
--> 'Thatis atis a tatist'

正则表达式的replace方法还有两个参数。
在默认的情况时正则表达式在找到了一个满足条件的时候就会停下来
但是假如你要是将isGlobal参数设置为True的话,它就会全文调换
在默认的情况下正则表达式是区分大小写的
推荐阅读
author-avatar
幸福的xinwangnanfei_736
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有