2017-11-18 98 views
1

我正在寫一個cpp程序,它是一個類似於cpp的語言的詞法分析器。爲了找到每個標記,我使用正則表達式來匹配,然後決定選擇正確的標記。如何使用正則表達式(詞法分析)表達類似cpp的字符串(詞法分析)

這種語言的字符串和cpp完全一樣。我使用的正則表達式是這樣的:

\"([^\\\"]|\\.)?\" 

但它不是真的正確。對於這樣的輸入:

"String \" int" 

輸出應該是一個字符串標記,但我的正則表達式,我得到一個字符串標記(「字符串」)和一個int關鍵字,然後一個錯誤。

你有什麼想法如何處理?或者我應該如何改變正則表達式?

P.S. :我使用regex_search()來查找匹配。

謝謝。

+0

'「String \」int「'字符串常量不包含'''char。使用'string s = R」String \\\「int」;' - 但是您的模式處理單引號和您的示例字符串有雙引號。 –

+0

@Gurman號字符串'「字符串」字符串「'是不可接受的,但你的正則表達式接受。 – Ali94

+0

@WiktorStribiżew我的例子只是顯示在控制檯中出現的內容,我的意思是你的代碼意味着什麼(也編輯我的正則表達式這是我的錯誤。) – Ali94

回答

1

您可以使用

std::regex rx(R"(\"[^\"\\]*(?:\\.[^\"\\]*)*\")"); 

模式是"[^"\\]*(?:\\.[^"\\]*)*"

  • " - 一個雙引號
  • [^"\\]* - 零個或多個字符不是一個雙引號和反斜線
  • (?:\\.[^"\\]*)*其他 - 零次或多次重複的
    • \\. - 在前面一個反斜槓任何字符(與[\s\S],如果你需要更換.也支持逃脫換行符)
    • [^"\\]* - 零個或多個字符不是一個雙引號和反斜線
  • 其他
  • " - 雙引號。

查看regex demo