真的很妙……
這篇是要說明 RegExp 在 VBScript (WShell, ASP皆同) 內使用的狀況, 今天正在解決一個解析指令的語法, 想說利用 Regulare Expression 這個好物來處理一下, 結果真是令人不開心啊. 因為查了半天 msdn, 都沒有找到將 group 元素取出的方式, 所以整個就是失落(因為明明就應該是有方法可以取出來才對). 查到的文件在這裡:
http://msdn.microsoft.com/en-us/library/ms974570.aspx
想說怎麼會沒有這個語法呢? 真的是太奇怪了. 於是再到 google 另外查了一下, 發現其實還有個 SubMatches 的 collection 啦, 原來如此, 這個才是真的拿到 group 元素的方式, 想來真的是自己沒有仔細查找清楚, 只能再做個筆記自己記錄一下.
msdn 其實是有資料的, 在這裡:
http://msdn.microsoft.com/en-us/library/y27d2s18(VS.85).aspx
好地, 回到主題, 簡單地說, 今天原來要做的需求很單純, 就是將一個控制指令中的各項參數取出, 如下:
control_[series]_batch_[bno]_target_[tno]_end
這樣的一個字串, 將其中的 [series], [bno], [tno] 取出來, for example, 像是這樣的一個指令:
control_276324_batch_23_target_14_end
要將其中的 276324 及 23 及 14 取出, 若是用 parse 的方式比較麻煩, 就是一個一個比對下去, 但用 RegExp 就方便了, 既能檢查 pattern, 又可以將參數一次取出, 一舉兩得, 接下來就著手來作業了, 程式碼如下:
strCmd = "control_276324_batch_23_target_14_end"
Set objReg = New RegExp
objReg.Pattern = "control_([0-9]+)_batch_([0-9]+)_target_([0-9]+)_end"
Set objMatches = objReg.Execute(strCmd)
If objMatches.Count > 0 Then
series = objMatches(0).SubMatches(0)
bno = objMatches(0).SubMatches(1)
tno = objMatches(0).SubMatches(2)
End If
Set objReg = Nothing
若是指令(strCmd)是多組, 也可以一次都處理完成, 利用 objMatches(i) 來取得, 不過就是要將 objReg.Global 設為 True 就是了.
這樣就可以一口氣將 series, bno, tno 全數取得, 一方面檢查看指令是否符合 pattern, 一方面又可以將所需要的參數取出, 豈不快哉!?