短信轉(zhuǎn)發(fā)匹配規(guī)則多重規(guī)則介紹

背景

短信轉(zhuǎn)發(fā)工具TranspondSms中,實(shí)現(xiàn)了幻馁,單個(gè)匹配規(guī)則提鸟,像這樣:

rule

一開(kāi)始是單個(gè)條件的匹配伏伐,比如 當(dāng)手機(jī)號(hào)是10086就轉(zhuǎn)發(fā) ,后面有用戶反饋說(shuō)有些短信單個(gè)條件不能篩選出來(lái)鸠补,「截圖」萝风,像這種情況,當(dāng)手機(jī)號(hào)是10086并且內(nèi)容包含欠費(fèi)就轉(zhuǎn)發(fā) 有群里用戶直接說(shuō)用正則表達(dá)式紫岩,之前有考慮一下规惰,發(fā)現(xiàn)正則表達(dá)式對(duì)普通用戶要求太高,并且不容易實(shí)現(xiàn)條件遞歸嵌套

自由度最高的就是自己實(shí)現(xiàn)一個(gè)語(yǔ)法集泉蝌,因?yàn)檫@里的場(chǎng)景很簡(jiǎn)單歇万,只是對(duì)短信進(jìn)行判斷而已,條件很少像手機(jī)號(hào)短信內(nèi)容卡槽 并且否或者 開(kāi)頭結(jié)尾包含相等 調(diào)研了一些語(yǔ)法解析器像 感覺(jué)很好用勋陪,但是用在這里有點(diǎn)殺雞用牛刀了贪磺,整理了一下要做什么決定手寫(xiě) 首先用戶輸入或選擇規(guī)則,如果要使用多級(jí)選擇框來(lái)實(shí)現(xiàn)多級(jí)嵌套界面有點(diǎn)難搞?

交互方案

遂決定直接使用文本框接受用戶提交的規(guī)則诅愚,然后對(duì)這些規(guī)則一行一行解析寒锚,然后組織嵌套關(guān)系,最后把要判斷的手機(jī)號(hào)短信內(nèi)容傳進(jìn)來(lái)進(jìn)行判斷


語(yǔ)法設(shè)計(jì)

接下來(lái)就是看怎么定義規(guī)則既語(yǔ)法呻粹,這里的嵌套情況像這種 當(dāng)手機(jī)號(hào)是10086并且(內(nèi)容包含欠費(fèi) 或者 內(nèi)容包含停機(jī)) 這里就看怎么表達(dá)這種嵌套關(guān)系壕曼,一種是直接用括號(hào)苏研,一種是模仿Python語(yǔ)法等浊,每一行代表一條規(guī)則,每一行前面用行首空格代表與上一條規(guī)則的關(guān)系摹蘑,比如兩行行首都是2個(gè)空格表示這兩行平級(jí)筹燕,逐個(gè)判斷就好,如果第一行0個(gè)空格第二行1空格衅鹿,就代表第二行規(guī)則屬于第一行規(guī)則撒踪,他們?cè)谝粋€(gè)小括號(hào)里,這樣就可以表達(dá)多個(gè)條件的優(yōu)先級(jí)了大渤。


解析

接下來(lái)是實(shí)現(xiàn)層面的設(shè)計(jì)制妄,既然每個(gè)規(guī)則有關(guān)聯(lián)比如下一個(gè)規(guī)則上一個(gè)規(guī)則子規(guī)則父規(guī)則,用一個(gè)列表肯定是不行的泵三,用樹(shù)可以耕捞,好,每個(gè)節(jié)點(diǎn)保存上個(gè)節(jié)點(diǎn)下個(gè)節(jié)點(diǎn)父節(jié)點(diǎn)子節(jié)點(diǎn)烫幕,并且保存規(guī)則本身像 并且當(dāng)手機(jī)號(hào)是10086

接下來(lái)是解析每一行 每個(gè)關(guān)鍵字用空格隔開(kāi)俺抽,考慮到用戶要求匹配的值無(wú)法想象,就把末尾的位置就給要求匹配的值较曼,每一行長(zhǎng)這個(gè)樣子 并且 不是 手機(jī)號(hào) 包含 10086hhchj紅紅火火恍恍惚惚 這里“包含”空格后面的值直接全部都是用戶要求匹配的值磷斧,這樣就減少解析用戶不確定輸入的未知風(fēng)險(xiǎn)

首先每一行一個(gè)一個(gè)字讀取,讀取有分為幾個(gè)狀態(tài),行首空格階段:用于記錄這一行有幾個(gè)行首空格弛饭,通過(guò)對(duì)比上個(gè)節(jié)點(diǎn)的行首空格數(shù)來(lái)確定和上個(gè)節(jié)點(diǎn)的關(guān)系 接著必須出現(xiàn) 并 或 兩個(gè)字之一冕末,這時(shí)階段變換行首空格階段結(jié)束,再后面一個(gè)字必須是且 者 兩個(gè)字之一孩哑,再后面必須是一個(gè)空格栓霜,這個(gè)階段是連接詞階段,用來(lái)解析出連接詞并且或者横蜒,如果不滿足這個(gè)語(yǔ)法直接輸出行號(hào)并報(bào)語(yǔ)法錯(cuò)誤:只支持并且或者 之后這個(gè)樣子依次是確認(rèn)詞階段胳蛮,匹配名階段,匹配值階段

當(dāng)各個(gè)階段都順利完成后丛晌,一條規(guī)則就生成了


連接

然后通過(guò)對(duì)比當(dāng)前規(guī)則和前一個(gè)規(guī)則的行首空格數(shù)確認(rèn)當(dāng)前規(guī)則和前一個(gè)規(guī)則的關(guān)系


最終生成一個(gè)規(guī)則樹(shù):


規(guī)則的執(zhí)行流程:


判定流程

對(duì)要判斷的短信(包含手機(jī)號(hào)仅炊,短信內(nèi)容),先執(zhí)行本節(jié)點(diǎn)的規(guī)則澎蛛,如果有子結(jié)點(diǎn)(圖中虛線指向的節(jié)點(diǎn))就遞歸合并子結(jié)點(diǎn)的規(guī)則匹配結(jié)果抚垄,如果有下一條規(guī)則(圖中實(shí)線箭頭指向的節(jié)點(diǎn))就遞歸合并下一條規(guī)則匹配結(jié)果;如果最后結(jié)果是真就轉(zhuǎn)發(fā)這條短信谋逻,為假就不轉(zhuǎn)發(fā)這條短信呆馁。

補(bǔ)充一個(gè)完整的流程圖:


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市毁兆,隨后出現(xiàn)的幾起案子浙滤,更是在濱河造成了極大的恐慌,老刑警劉巖气堕,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沼死,死亡現(xiàn)場(chǎng)離奇詭異建邓,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)省有,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跷敬,“玉大人茸炒,你說(shuō)我怎么就攤上這事伯铣。” “怎么了宿百?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵趁仙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我犀呼,道長(zhǎng)幸撕,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任外臂,我火速辦了婚禮坐儿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己貌矿,他們只是感情好炭菌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著逛漫,像睡著了一般黑低。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上酌毡,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天克握,我揣著相機(jī)與錄音,去河邊找鬼枷踏。 笑死菩暗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的旭蠕。 我是一名探鬼主播停团,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼掏熬!你這毒婦竟也來(lái)了佑稠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤旗芬,失蹤者是張志新(化名)和其女友劉穎舌胶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體岗屏,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辆琅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年漱办,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了这刷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡娩井,死狀恐怖暇屋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洞辣,我是刑警寧澤咐刨,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站扬霜,受9級(jí)特大地震影響定鸟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜著瓶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一联予、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦沸久、人聲如沸季眷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)子刮。三九已至,卻和暖如春窑睁,著一層夾襖步出監(jiān)牢的瞬間挺峡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工担钮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留沙郭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓裳朋,卻偏偏與公主長(zhǎng)得像病线,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鲤嫡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容