2011-10-08 86 views
0

有這樣的模式:解析正則表達式命令

(parse file_name (txt or ini)) or/and (if (string)(== or !=)(string)/* must be at least one */ (and)/*cannot be at the end without expression on right*/) 

說明:有兩個命令 - 「解析」和「如果」。有三種情況下混合這些命令:

  • '解析' + '如果'
  • '解析'
  • '如果'

如果 '解析' 被使用,則 'FILE_NAME'必須提供,並且可以提供'txt'或'ini',但不必。

如果使用'if',那麼必須至少有一個操作'string'('=='或'!=')'string'。可以使用多個由'和'分隔的操作,但是'和'不能在操作列表的末尾使用,例如'如果a == c和b == d和' - 不正確。

我試着寫了下面的正則表達式,但它不工作:

std::string text = "parse file txt if hello==name and a!=age and owner==me"; 
boost::regex expr(".*(parse) *(\\w*) *(txt|ini)* *(if) *(*([a-z\"]+)(==|!=)([a-z\"]+) *(and)*)* *"); 
boost::smatch what; 
std::cout << text << std::endl; 
if (boost::regex_search(text, what, expr)) 
    for (int j = 0; j < what.size(); ++j) 
    { 
     std::cout << what[j] << std::endl; 
    } 

輸出:

parse file txt if hello==name and a!=age and owner==me 
parse file txt if hello==name and a!=age and 
parse 
file 
txt 
if 
owner==me 
owner 
== 
me 
and 

什麼是這種情況下,正確的正則表達式?

+0

什麼是無?空字符串是可接受的輸入嗎? – FailedDev

+0

這意味着命令是空的,但是我認爲在運行之前檢查string.empty()會更容易,我會改變它。 – scdmb

+0

爲什麼你想使用正則表達式呢?聽起來你想爲你的命令建立一個詞法分析器和解析器。您只需爲您的語言描述一個法律語法,自動化工具就可以爲您生成一個詞法分析器和解析器。 – R0MANARMY

回答

3

您應該考慮使用實際的解析器而不是正則表達式。正則表達式是一個強大的工具,但你試圖做的並不是真正意義上的。要麼自己寫一個(不應該對於手頭的問題那麼難),要麼去尋找一個解析庫或解析器生成器。