摘要:TTCN-3是一個由ETSI維護(hù)的全球適用的標(biāo)準(zhǔn)測試語言。在TTCN-3測試平臺設(shè)計與實現(xiàn)中,字符模式匹配機(jī)制是一個重要組成部分。提出一種采用面向?qū)ο蟮某绦蛟O(shè)計語言C++來實現(xiàn)TTCN-3測試平臺中字符模式匹配方法,并給出了實例驗證。
關(guān)鍵詞:C++;TTCN-3;正則表達(dá)式;字符模式匹配
中圖分類號:TP306
文獻(xiàn)標(biāo)識碼:A 文章編號:1672-7800(2015)003-0030-02
0 引言
TTCN-3(Testing and Test Control Notation Version 3)是目前流行的一種測試語言。在TTCN-3測試平臺設(shè)計與實現(xiàn)過程中,模板匹配機(jī)制是需要實現(xiàn)的一個重要部分,包括指定值匹配、缺省值匹配、值列表匹配、補(bǔ)值列表匹配、任意值匹配、任意值或空匹配、值范圍匹配、超集匹配、子集匹配、任意元素匹配、任意元素或空匹配、排列匹配、字符模式匹配共計13種匹配機(jī)制[1],其中一個重要匹配機(jī)制為字符模式匹配,它可以用于定義一個接收模板需求的字符串格式并允許一些元字符的使用,例如,在一個字符模式中,“?”和“*”分別意味著匹配任一字符和匹配任意數(shù)目的任一字符。字符模式匹配機(jī)制與正則表達(dá)式有許多相似之處,本文采用面向?qū)ο蟮某绦蛟O(shè)計語言C++中的“準(zhǔn)”標(biāo)準(zhǔn)庫boost庫中的正則表達(dá)式庫regex來實現(xiàn)TTCN-3模板的字符模式匹配機(jī)制。boost庫是一個開源并且完全免費(fèi)的C++程序庫,而boost::regex是目前C++語言對于正則表達(dá)式支持較好的程序庫。
1 問題分析
TTCN-3中可以定義的模板包括用于發(fā)送的模板和用于接收的模板,而字符模式匹配機(jī)制可以用于在接收模板中定義一個需要接收字符串的格式,關(guān)鍵字是“pattern”。需要注意的是,字符模式匹配機(jī)制只能用于匹配TTCN-3中的charstring和univeral charstring數(shù)據(jù)值[1-2]。舉例如下:
template charstring MyTemplate :=pattern “a*bc”
該模板可以匹配任意以字母“a”開頭,接著可以是任意數(shù)目(可以是0個)任一字符,之后是以字母“bc”結(jié)尾的字符串。其中“*”稱為字符模式的元字符,TTCN-3字符模式中的元字符指那些在字符模式中具有特殊意義的專用字符。元字符本身是一個個單一字符,但是不同或者相同的元字符組合起來可以構(gòu)成大的元字符。
正則表達(dá)式(Regular Expression通常縮寫成“regex”)指一個用來描述或者匹配一系列符合某個語法規(guī)則的字符串的單個字符串,因而具有比單個或多個字符串更強(qiáng)大的描述能力。通俗地講就是用一個“字符串”來描述一個特征,然后去驗證另一個“字符串”是否符合該特征[3-4]。正則表達(dá)式對于解決相當(dāng)數(shù)量的模式匹配問題至關(guān)重要,許多程序設(shè)計語言都支持利用正則表達(dá)式進(jìn)行字符串操作。正則表達(dá)式引擎則是一種可以處理正則表達(dá)式的軟件,引擎通常是更大的應(yīng)用程序的一部分。C++程序設(shè)計語言中支持正則表達(dá)式的準(zhǔn)標(biāo)準(zhǔn)庫boost::regex,頭文件是
從以上分析可以看到,實際上,TTCN-3中的字符模式也即是TTCN-3所支持的正則表達(dá)式,但是由于TTCN-3字符模式的語法規(guī)則和C++所支持的perl語法正則表達(dá)式有所不同,兩者并不兼容,因而在TTCN-3測試平臺實現(xiàn)中,需要將符合TTCN-3語法規(guī)則的字符模式翻譯成符合perl語法的面向?qū)ο蟪绦蛟O(shè)計語言C++所支持的正則表達(dá)式。以charstring類型為例,對TTCN-3測試平臺開發(fā)過程中定義與實現(xiàn)字符模式匹配的過程加以說明:首先定義charstring類型的模板,實例化為對應(yīng)的數(shù)據(jù)值,設(shè)定相應(yīng)的字符模式匹配標(biāo)識,為相應(yīng)數(shù)據(jù)值模板對象賦值(無論是否帶有具有特殊意義的元字符均視為普通字符串類型),最終返回帶有字符模板匹配機(jī)制的charstring數(shù)據(jù)值模板對象實例;在接收操作中,需要將系統(tǒng)接收到的charstring數(shù)據(jù)值與帶有字符模式匹配機(jī)制的模板進(jìn)行匹配,實現(xiàn)匹配操作時,首先應(yīng)該將帶有字符模式匹配機(jī)制的模式串轉(zhuǎn)換為符合Perl語法的正則表達(dá)式,之后才可以使用匹配算法regex_match進(jìn)行匹配操作,并返回匹配結(jié)果(true 或是false),系統(tǒng)根據(jù)匹配結(jié)果進(jìn)行下一步測試操作,如圖1所示。以上過程實際上涉及了TTCN-3測試平臺中TE實體內(nèi)部的3個交互實體:ETS、TTCN-3運(yùn)行時系統(tǒng)(T3RTS)和一個可選的內(nèi)部編解碼系統(tǒng)(EDS)實體。為了突出本文內(nèi)容,這里隱去這一部分,TTCN-3數(shù)據(jù)類型、數(shù)據(jù)值及模板表示見參考文獻(xiàn)[5],不再贅述。
2 實現(xiàn)方法
從以上分析可以看到,匹配操作中的關(guān)鍵一步就是實現(xiàn)模板字符串從TTCN-3字符模式匹配機(jī)制到符合Perl語法的正則表達(dá)式的轉(zhuǎn)換,兩者區(qū)別主要在于某些帶有特殊意義的元字符有所不同。TTCN-3字符模式匹配機(jī)制與Perl語法的正則表達(dá)式中不同元字符的對比如表1所示。
從表1可以看出,兩者元字符的含義確實不同。本文采用的轉(zhuǎn)換思想如下:①構(gòu)造含有需替換TTCN-3字符模式元字符的正則表達(dá)式reg;②使用boost::regex_replace方法進(jìn)行字符串的查找與替換,以及格式轉(zhuǎn)換,如果字符模式中含有“?”、“*”、“*#n”、“#(n,m)”,則替換為符合Perl語法的正則表達(dá)式的字符,否則不作任何修改;③使用boost::regex_match方法進(jìn)行正則表達(dá)式的匹配操作,返回值為True或是False。
3 翻譯示例
對上述例子進(jìn)行說明如下:
TTCN-3代碼:template charstring MyTemplate :=pattern “a*bc”;
對應(yīng)接收操作時模板匹配的C++翻譯代碼:
int i = String.find('*');
String.replace(i, 1, “.*”);
boost::regex reg(String);
bool b=boost::regex_match(data,reg);//data是測試系統(tǒng)接收到的數(shù)據(jù)值
4 結(jié)語
本文提出了一種采用面向?qū)ο蟮某绦蛟O(shè)計語言C++實現(xiàn)TTCN-3中模板的字符模式匹配方法。通過分析字符模式匹配機(jī)制與Perl語法的正則表達(dá)式的不同,找到兩者轉(zhuǎn)換的方法,并給出了實例說明。研究中需注意正則表達(dá)式的貪婪性,本文使用正則表達(dá)式的默認(rèn)貪婪模式。
參考文獻(xiàn):
[1] ETSI.Methods for testing and specification(MTS);The testing and test control notation version3;part5:TTCN-3 runtime interface (TRI) [S]. FRANCE, ETSI ES 201 873-1 V3.2.1,2007.
[2] ETSI.Methods for testing and specification(MTS);the testing and test control notation version3;part1:TTCN-3 core language[S]. FRANCE,ETSI ES 201 873-1 V3.2.1,2007.
[3] 王艷,李冬梅.基于正則表達(dá)式的協(xié)議識別方案[J].軟件導(dǎo)刊,2009(2):47-49.
[4] 賀煒.網(wǎng)包正則表達(dá)式匹配算法研究[D].鄭州:解放軍信息工程大學(xué),2013.
[5] 鄭冰.基于TTCN-3測試平臺的模板匹配問題的研究與實現(xiàn)[D].呼和浩特:內(nèi)蒙古大學(xué),2009.
[6] 周冬初,鞠鳳娟,郭東琿.基于Struts2框架校驗數(shù)據(jù)及整合正則表達(dá)式的實現(xiàn)方法[J].計算機(jī)與現(xiàn)代化,2011(1):85-87.
(責(zé)任編輯:孫 娟)