2010-01-11 56 views
41

我正在嘗試學習flex並希望匹配字符串文字。我的代碼目前的樣子:flex/lex中字符串文字的正則表達式

"\""([^\n\"\\]*(\\[.\n])*)*"\""  {/*matches string-literal*/;} 

我一直與一個小時左右的變化掙扎,無法得到它的工作的方式應該。我基本上希望匹配一個不能包含換行符的字符串文字(除非它已被轉義)並支持轉義字符。

我可能只是寫了一個糟糕的正則表達式或與flex不兼容的表達式。請指教!

+0

非常感謝大家!您的所有評論都非常有幫助。終於爲我工作的正則表達式是由codadict連接的C規範中的變體(由Jonathan解釋):\「(\\(。| \ n)| [^ \\」\ n)) * \「 – Thomas

+0

既然您發現Jonathan的答案有幫助,請考慮爲他的答案添加upvote。 – codaddict

+0

順便說一下:您的問題中沒有任何地方指定您感興趣的語言的字符串文字。將語言你在問題的標籤之一問。 –

回答

92

的字符串包含一個引號

" 
0123的

後跟零個或多個任意一個逃脫任何

\\. 

或非引號字符

[^"\\] 

終於結束引號的

" 

把它放在一起,並你有

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

分隔符引號會因爲Flex元字符而被轉義。

+6

+1,以清楚地說明發生了什麼。 – codaddict

+3

不幸的是,這並不處理轉義。因此,這會錯誤地法'「\」「' –

+4

你一定錯過了‘零個或多個轉義什麼的?’ –

8

如何使用開始狀態...

 
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輸入檢測報價,它切換到另一種狀態,然後繼續詞法,直到它到達另一句名言,在其恢復到正常狀態

+1

過於複雜的匹配是不是 – samoz

+2

@Samoz:不是真的,它實際上是在語言用在字符串文字的使用,它吃了一開始的報價和最終報價之間有什麼,即使有多餘的它裏面的報價,因此,以嚼起來引號開關狀態的使用... – t0mm13b

+5

柔性手冊包含一個完整的例子(Flex中使用的術語)分析C風格的字符串:http://flex.sourceforge.net /manual/Start-Conditions.html搜索該網頁上的「帶引號的字符串」 –

17

對於單線...您可以使用此:

\"([^\\\"]|\\.)*\" {/*matches string-literal on a single line*/;} 
+1

這是這裏最好的答案。 – refi64

0

答案遲到但對下一個需要它的人有用:

\"(([^\"]|\\\")*[^\\])?\" 
+1

歡迎來到SO。這個答案會改善文字解釋*如何*它的作品和*如何*它是不同的。 –