2015-07-12 78 views
0

我試圖找到一種方法來簡化布爾值的比較案例。目前,只有三個(如下所示),但我即將添加第四個選項,這變得非常乏味。如何簡化C++布爾比較

bracketFirstIndex = message.indexOf('['); 
mentionFirstIndex = message.indexOf('@'); 
urlFirstIndex = message.indexOf(urlStarter); 

bool startsWithBracket = (bracketFirstIndex != -1); 
bool startsWithAtSymbol = (mentionFirstIndex != -1); 
bool startsWithUrl = (urlFirstIndex != -1);  

if (!startsWithBracket) 
{ 
    if (!startsWithAtSymbol) 
    { 
     if (!startsWithUrl) 
     { 
      // No brackets, mentions, or urls. Send message as normal 
      cursor.insertText(message); 
      break; 
     } 
     else 
     { 
      // There's a URL, lets begin! 
      index = urlFirstIndex; 
     } 
    } 
    else 
    { 
     if (!startsWithUrl) 
     { 
      // There's an @ symbol, lets begin! 
      index = mentionFirstIndex; 
     } 
     else 
     { 
      // There's both an @ symbol and URL, pick the first one... lets begin! 
      index = std::min(urlFirstIndex, mentionFirstIndex); 
     } 
    } 
} 
else 
{ 
    if (!startsWithAtSymbol) 
    { 
     // There's a [, look down! 
     index = bracketFirstIndex; 
    } 
    else 
    { 
     // There's both a [ and @, pick the first one... look down! 
     index = std::min(bracketFirstIndex, mentionFirstIndex); 
    } 

    if (startsWithUrl) 
    { 
     // If there's a URL, pick the first one... then lets begin! 
     // Otherwise, just "lets begin!" 
     index = std::min(index, urlFirstIndex); 
    } 
} 

有比較幾種布爾值更好/更簡單的方法,還是我停留在這個格式,我應該嘗試在適當位置的第四選項擠?

+1

看起來你正在解析一些文本......你可能會用正則表達式或使用解析器生成器來簡化它。 –

+0

@MichaelAaronSafyan你可以詳細闡述一下REGEX計劃/解析器生成器(我從來沒有聽說過這個措辭)。 – ZeldaZach

+1

@ZeldaZach你能告訴我們你想分析什麼嗎?這似乎是某種電子郵件或URL,但我不記得'['參與任何這些。如果你能具體談談您的問題,我們也許能夠幫助正則表達式。 – Havenard

回答

3

某些類型的文本處理是相當普遍的,對於那些,您應該強烈考慮使用現有的庫。例如,如果您正在處理的文本使用的語法爲markdown,請考慮使用現有的庫將縮減解析爲結構化格式以供您解釋。

如果這是完全自定義的解析,則有幾個選項:

  • 對於非常簡單的文本處理(如預期 單個字符串是在幾個格式之一或含有一塊預期格式的潛臺詞),請使用regular expressions。在C++中,RE2庫爲匹配和提取使用正則表達式提供了非常強大的支持。

  • 對於更復雜的文本處理,例如跨越多行或具有各種內容/語法的數據,請考慮使用現有的詞法分析器和分析器生成器。 FlexBison是常用的工具(一起使用)根據語法自動生成用於解析文本的邏輯。

  • 您可以像現在一樣手動編寫您自己的解析邏輯。

如果用後一種方法去,有把事情簡單化幾個方面:

  1. 獨立的「詞法」(分手輸入令牌)和「分析」(解釋一系列令牌)分成不同的階段。

  2. 定義一個「令牌」類,並且表示可以你的語法(如RawText,關鍵詞,AtMention等)內出現

  3. 創建代表所述狀態中的一個或多個的枚舉類型的符號的對應的層次結構您的解析邏輯可以在。

  4. 實現您的lexing和解析邏輯作爲一個狀態機,它轉換給定當前狀態和下一個標記或字母的狀態。從(狀態,令牌類型)到next_state或從(狀態,令牌類型)到handler_function構建映射可幫助您簡化結構。

0

由於您使用的起始字母只有開關,用例:關於開關的語法

enum State { Start1, Start2, Start3, Start4}; 
State state; 
if (startswithbracket) { 
    state = Start1; 
} else { 
. 
. 
. 
} 

switch (state) { 
    case Start1: 
     dosomething; 
     break; 
    case Start2: 
     . 
     . 
     . 
} 

的更多信息和使用案例可以發現here