怎樣使用XSL和Regex來驗證資料的有效性(一)

來源:互聯網
上載者:User
資料|正則 系列之十七:如何使用XSL和Regex來驗證資料的有效性
XSL現在正在逐漸的成為XML中的類似與SQL在資料庫設計中的地位。
雖然Microsoft's XSL僅僅是實現了其中的某一些部分的功能
但是你已經能夠實現非常複雜的查詢了
雖然現在的XSL僅僅還只是一種基於純粹文本和字串方式
的查詢語言
在下面介紹的例子中,將大量使用到文本內的字串方式的搜尋,
你會發現在XML中對資料的處理很大一部分都是要使用到文本內的查詢的。
這在XSL的編寫中是一件非常普及的功能。
正是因為這樣,你應該瞭解一些Regex應該如何來使用。

Regex的簡單介紹
Regex大部分都是來自與Unix世界的需要。
在Unix中許多程式設計語言幾乎整個都是圍繞著Regex進行的(例如Perl, Python, Tcl)
但是令人感到奇怪的是Regex好象是最近才使用在Windows系列中的,
特別是大量的使用在指令碼語言中,例如JavaScript和VBScript,
儘管你也可以將它們使用在Visual Basic或則Java中,但是顯然它們似乎在
指令碼語言中更加有吸引力。也許是這個緣故把,大家平時似乎都很少使用Regex把。

使用Regex,你可以根據你想查詢的內容建立一個匹配模板(英文叫pattern)
一旦你使用Regex建立了一個模板,你就可以使用它來測試你的字串了,
使用它可以完成很多功能:
例如判斷一個字串是否在另外一個字串中(或則在另外一個字串中的什麼位置)
例如使用一個字串來替換另外一個字串
例如返回所有滿足模板條件的字串列表
例如。。。等等等等

上面我介紹了有關Regex的基本概念,有關它的詳細說明和文法可以查閱MSDN和
JavaScript中的有關協助。
在VB中如果你想引用Regex的話,你需要在項目中引用"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.
注意我加粗的部分:
第一句是建立一個Regex的對象
第二句是指定該Regex的模板
第三句就是根據模板執行查詢了
呵呵,如果Regex的功能僅僅是這麼簡單的話,也許你會說
VB中的instr()不就能夠代替了嗎?

但是,在進行XML的資料格式化的時候,對字串的處理遠比這個複雜得多。
例如:假設你要確保你要驗證的欄位中是否包含一個well-formed的zip編碼
(well-formed意味著它是一個有效編碼,
也許它對於某個給定的地方或則地區或則國家又是無效的
這種界於well-formed和valid的運算式將是本文裡面討論的重點)
如果你要是使用VB來進行這種判斷的話將非常的難看
你需要判斷是否運算式有5位或則10位元字,或則是否為字母,
然後第6位字母又必須得是一個破則號
但是如果是使用Regex的話,將會是這樣的簡單:

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個數字是可選的,即可有也可以沒有
$ 這個運算式後面應該不會再有其它的什麼東西了

最有意思的是一旦你定義好了這麼一個模板,你就可以將它使用在
任何其它的Regex對象中,而不需要再重建立立一個Regex對象了了。
使用這個辦法,你甚至可以把一個近2000行代碼的JavaScript程式
減少到只有幾百行,設定當你把一些模板組合在一起的時候,就能夠完成
Regex本來不可能完成的東東了。

下面我再舉一個用來驗證資料有效性的例子:
例如你現在想驗證一個電話號碼資料是否有效
對於通用一個電話號碼一般下面這幾種寫法都是有效:
(800)555-1212
1(800) 555-1212
1-800-555-1212
1.800.555.1212
等等.

如果你使用指令碼來寫一段滿足上面所有要求的代碼將非常的複雜。
但是如果你使用Regex的話,將非常的簡單,只有下面這兩句代碼:
Set IsPhoneNumber=new RegExp
IsPhoneNumber.pattern="^[01]?\s*[\(\.-]?(\d{3})[\)\.-]?\s*(\d{3})[\.-](\d{4})$"

你可以仔細體會上面這個代碼的意義。
首先它驗證第一個字元是否為0或則是否為1或則根本就沒有。
然後再進行下面的驗證,大家可以自己琢磨其它部分的意思把,呵呵。

查詢和替換資料
當然,驗證資料的有效性僅僅是它能夠做的一件小事而已,
但是更有用的是:如果你能夠把上面那麼多種電話號碼的表達方式轉換
成一種統一的方式顯示出來。
例如我要把上面的電話號碼格式化成XML中的一個片段如下:

<phoneNumber>
<areacode>123</areacode>
<exchange>456</exchange>
<local>7890</local>
</phoneNumber>

這時的電話號碼的模板分成三個部分:
(\d{3}), (\d{3}), (\d{4}), 分別表示area code, exchange, 和local number
. 在Regex中,正則解譯器會自動
將匹配的字元賦值給變數 $1, $2, $3,等.
這樣你使用下面的代碼就能夠實現

re.Replace("1(352)351-4159", "<phoneNumber><areacode>$1</areacode><exchange>$2</exchange><local>$3</local></phoneNumber>")

如果你覺得這個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"
最精彩的還是使用Regex了
Debug.Print Replacex("This is a test","\ws","at")
--> "That at a



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。