2009-12-14 56 views
1

我有一個需要支持以下品牌的參數的命令行應用程序:最有效的方法來解析小,具體參數

  1. 所有:返回的一切
  2. 搜索:返回第一個匹配搜索
  3. 所有*搜索:返回匹配的一切搜索
  4. X *搜索:返回第一個X匹配搜索
  5. 搜索#Y:返回第Y匹配搜索

其中搜索可以是單個關鍵字或空格分隔的關鍵字列表,由單引號分隔。關鍵字是一個或多個字母和數字的序列 - 沒有別的。

幾個例子可能是:

  1. 2 * foo的
  2. 吧#8
  3. 所有* '富巴'

這聽起來剛好夠複雜,柔性/野牛來但是應用程序可能會經常需要像這樣解析字符串,而且我覺得(因爲沒有涉及計數)完全成熟的解析器會導致完全太多的開銷。

你會推薦什麼?一連串的字符串操作?幾個強大的子模式捕獲正則表達式? 實際上對於「真正的」解析器有一個似是而非的論點?

這可能是需要注意的是這個僞語法語法也不會有變動有用的,因此,如果代碼就低於奇妙保持能力,我不會哭。這完全在C++中,如果這有所作爲。

謝謝!

+1

我會說:「這聽起來很簡單*足以手動編碼。」沒有lex/yacc/regexp,我做了比這更復雜的解析。 – Dan 2009-12-14 07:58:08

+0

我喜歡你的觀點 - 事實上,我已經退後一步,再次看到問題,現在看到簡單的字符串操作可以輕鬆解決野獸的問題。 – 2009-12-14 08:25:10

回答

0

答案主要取決於之間你要多少編碼做,平衡多少庫要依靠 - 如果您的應用程序可以依賴於其他庫,你可以使用任何的許多正則表達式庫 - 例如POSIX正則表達式,它具有所有Linux/Unix版本。

OR

如果你只是想那些特定的語法,我會用字符串標記(strtok的) - 上「*」和分裂的「#」分裂 - 再處理每種情況。

+0

雖然我決定不使用strtok,但我確實設法找到了一個沒有正則表達式庫的相當直接的解決方案。 – 2009-12-14 08:25:51

2

我不會推薦一個完整的lex/yacc解析器。你所描述的可以容納一個簡單的正則表達式:

((all|[0-9]+)\*)?('[A-Za-z0-9\t ]*'|[A-Za-z0-9]+)(#[0-9]+)? 

如果您有支持捕獲正則表達式引擎,可以很容易地提取信息的單件需要。 (最有可能捕獲1,3和4)。

如果我明白你的意思,你可能想要檢查捕獲1和捕獲4不是同時是非空的。

如果您需要進一步拆分搜索條件,你能做到這一點在後面的步驟,分析捕獲3

即使沒有正則表達式,我將手寫一個函數。這會比處理lex/yacc更簡單,我想你可以把一些比正則表達式更有效的東西放在一起。

+0

這很好地證實了我的想法(使用正則表達式)。同意我可以更有效地寫入原始字符串操作符以適應賬單,而不是將PCRE拉入戰場 - 但經過反思,那裏的淨收益可能不值得我花時間調試。感謝您的洞察! – 2009-12-14 07:39:53

0

在這種情況下,strtok方法會更好,因爲要解析的命令數很少。

相關問題