我正在嘗試學習flex並希望匹配字符串文字。我的代碼目前的樣子:flex/lex中字符串文字的正則表達式
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
我一直與一個小時左右的變化掙扎,無法得到它的工作的方式應該。我基本上希望匹配一個不能包含換行符的字符串文字(除非它已被轉義)並支持轉義字符。
我可能只是寫了一個糟糕的正則表達式或與flex不兼容的表達式。請指教!
我正在嘗試學習flex並希望匹配字符串文字。我的代碼目前的樣子:flex/lex中字符串文字的正則表達式
"\""([^\n\"\\]*(\\[.\n])*)*"\"" {/*matches string-literal*/;}
我一直與一個小時左右的變化掙扎,無法得到它的工作的方式應該。我基本上希望匹配一個不能包含換行符的字符串文字(除非它已被轉義)並支持轉義字符。
我可能只是寫了一個糟糕的正則表達式或與flex不兼容的表達式。請指教!
的字符串包含一個引號
"
0123的
後跟零個或多個任意一個逃脫任何
\\.
或非引號字符
[^"\\]
終於結束引號的
"
把它放在一起,並你有
\"(\\.|[^"\\])*\"
分隔符引號會因爲Flex元字符而被轉義。
如何使用開始狀態...
int enter_dblquotes = 0; %x DBLQUOTES %% \" { BEGIN(DBLQUOTES); enter_dblquotes++; } <DBLQUOTES>*\" { if (enter_dblquotes){ handle_this_dblquotes(yytext); BEGIN(INITIAL); /* revert back to normal */ enter_dblquotes--; } } ...more rules follow...
很相似的效果(Flex使用%s
或%x
,表示將預期的狀態,當flex輸入檢測報價,它切換到另一種狀態,然後繼續詞法,直到它到達另一句名言,在其恢復到正常狀態
對於單線...您可以使用此:
\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;}
這是這裏最好的答案。 – refi64
答案遲到但對下一個需要它的人有用:
\"(([^\"]|\\\")*[^\\])?\"
歡迎來到SO。這個答案會改善文字解釋*如何*它的作品和*如何*它是不同的。 –
非常感謝大家!您的所有評論都非常有幫助。終於爲我工作的正則表達式是由codadict連接的C規範中的變體(由Jonathan解釋):\「(\\(。| \ n)| [^ \\」\ n)) * \「 – Thomas
既然您發現Jonathan的答案有幫助,請考慮爲他的答案添加upvote。 – codaddict
順便說一下:您的問題中沒有任何地方指定您感興趣的語言的字符串文字。將語言你在問題的標籤之一問。 –