我只能找到反面反面,像(?<!\\)
。
但這不會在C++和flex中編譯。似乎regex.h和flex都支持這個?C++正則表達式前面沒有反斜槓,前面加反斜槓
我試圖實現一個外殼,必須得到像>
,<
|
這樣的特殊字符作爲普通參數字符串,前提是反斜槓。換句話說,只有把特殊字符爲特殊不是由0或偶數「\」
所以echo \\>a
或echo abc>a
應直接輸出到a
但echo \>a
之前應打印>a
什麼正則表達式應我用?
我使用flex和yacc來解析輸入。
我只能找到反面反面,像(?<!\\)
。
但這不會在C++和flex中編譯。似乎regex.h和flex都支持這個?C++正則表達式前面沒有反斜槓,前面加反斜槓
我試圖實現一個外殼,必須得到像>
,<
|
這樣的特殊字符作爲普通參數字符串,前提是反斜槓。換句話說,只有把特殊字符爲特殊不是由0或偶數「\」
所以echo \\>a
或echo abc>a
應直接輸出到a
但echo \>a
之前應打印>a
什麼正則表達式應我用?
我使用flex和yacc來解析輸入。
您不能輕易從命令行中提取單個轉義字符,因爲您不知道該字符的上下文。在最簡單的情況下,考慮以下因素:
LessThan:\<
BackslashFrom:\\<
在第一個,<
是一個轉義字符;在第二個,它不是。如果你的語言包含引號(就像大多數貝殼一樣),事情變得更加複雜。從左到右解析字符串,一次一個實體,會更好。 (我自己用flex
,因爲我已經不再浪費我的時間來編寫和測試詞法分析器了,但是你可能有一些教學理由要這樣做。)
如果你真的需要找到一個不應該的特殊字符是特別的,只是尋找它(在C++ 98,在那裏你沒有原始文字,你必須逃避所有的反斜線):
regex: (\\\\)*\\[<>|]
(An even number -- possibly 0 -- of \, then a \ and a <, > or |)
as a C string => "(\\\\\\\\)*\\\\[<>|]"
對不起,我忘了提及我正在做flex裏面的匹配任何建議嗎?我試圖在他們面前沒有'\'(甚至是精確的'\'的數字)來獲得特殊字符。 – LoveProgramming 2013-03-06 19:57:34
在一個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」不匹配。吃你的尾隨命令結束符!)。
希望有幫助!
你指的是哪個庫? C++ 98沒有規範的正則表達式庫。在C++ 11中,你有std :: regex:http://en.cppreference.com/w/cpp/regex/basic_regex。如果它存儲在一個字符串中,你也許需要兩次將反斜槓轉義:'「...(?<!\\\\)...」' – kay 2013-03-06 17:33:18
你想逃避嗎?是否有你想使用正則表達式的特定原因? – CrazyCasta 2013-03-06 17:34:14
C字符串中的反斜槓需要自己的轉義,顯示您用來構建正則表達式的代碼 – jthill 2013-03-06 17:34:17