2013-03-06 138 views
0

我只能找到反面反面,像(?<!\\)
但這不會在C++和flex中編譯。似乎regex.h和flex都支持這個?C++正則表達式前面沒有反斜槓,前面加反斜槓

我試圖實現一個外殼,必須得到像>,<|這樣的特殊字符作爲普通參數字符串,前提是反斜槓。換句話說,只有把特殊字符爲特殊不是由0或偶數「\」

所以echo \\>aecho abc>a應直接輸出到a
echo \>a之前應打印>a

什麼正則表達式應我用?
我使用flex和yacc來解析輸入。

+2

你指的是哪個庫? C++ 98沒有規範的正則表達式庫。在C++ 11中,你有std :: regex:http://en.cppreference.com/w/cpp/regex/basic_regex。如果它存儲在一個字符串中,你也許需要兩次將反斜槓轉義:'「...(?<!\\\\)...」' – kay 2013-03-06 17:33:18

+1

你想逃避嗎?是否有你想使用正則表達式的特定原因? – CrazyCasta 2013-03-06 17:34:14

+1

C字符串中的反斜槓需要自己的轉義,顯示您用來構建正則表達式的代碼 – jthill 2013-03-06 17:34:17

回答

0

您不能輕易從命令行中提取單個轉義字符,因爲您不知道該字符的上下文。在最簡單的情況下,考慮以下因素:

LessThan:\< 
BackslashFrom:\\< 

在第一個,<是一個轉義字符;在第二個,它不是。如果你的語言包含引號(就像大多數貝殼一樣),事情變得更加複雜。從左到右解析字符串,一次一個實體,會更好。 (我自己用flex,因爲我已經不再浪費我的時間來編寫和測試詞法分析器了,但是你可能有一些教學理由要這樣做。)

如果你真的需要找到一個不應該的特殊字符是特別的,只是尋找它(在C++ 98,在那裏你沒有原始文字,你必須逃避所有的反斜線):

regex: (\\\\)*\\[<>|] 
    (An even number -- possibly 0 -- of \, then a \ and a <, > or |) 
as a C string => "(\\\\\\\\)*\\\\[<>|]" 
+0

對不起,我忘了提及我正在做flex裏面的匹配任何建議嗎?我試圖在他們面前沒有'\'(甚至是精確的'\'的數字)來獲得特殊字符。 – LoveProgramming 2013-03-06 19:57:34

1

在一個Flex規則文件,你」 d使用\\來匹配單個反斜槓'\'字符。這是因爲\被用作Flex中的轉義字符。

BACKSLASH   \\ 
    LITERAL_BACKSLASH \\\\ 
    LITERAL_LESSTHAN \\\\< 
    LITERAL_GREATERTHAN \\\\> 
    LITERAL_VERTICALBAR \\\\| 

如果我跟着你正確的,你的情況,你想「\>」被當作文字「>」,但「\\>」被當作文字「\」之後特別重定向。你不需要負面的背後或任何特別的東西來實現這一點,因爲你可以建立一個規則,既接受你的常規參數字符,也接受你的特殊字符的文字版本。爲了討論的目的,我們假設你的參數/參數可以包含'','\ t'以及特殊形式的'>','<','|'。然後論證的規則是這樣的:

ARGUMENT ([^ \t\\><|]|\\\\|\\>|\\<|\\\|)+ 

其中:

[^ \t\\><|]任何單個字符,但「」,「\ T」,和你的特殊字符匹配
\\\\匹配「任何實例(即字面反斜槓)
\\>匹配任何「>」實例(即文字大於)
\\<匹配任何「\ <」(即小於)
\\\|匹配「\ |」的任何實例(即字面豎線/管)

其實......你可能只需要縮短該規則:

ARGUMENT ([^ \t\\><|]|\\[^ \t\r\n])+ 

其中:

[^ \t\\><|]任何單個字符,但 '',「匹配\ t'和您的特殊字符
\\[^ \t\r\n]匹配您的輸入中以'\'開頭的任何字符,除了空格(它將處理所有特殊字符並允許所有其他字符的字面形式)

如果要允許參數/參數中的文字空白,則可以進一步縮短規則,但在規則變更的後半部分使用\\.時要小心,因爲它可能與「\ n」不匹配。吃你的尾隨命令結束符!)。

希望有幫助!