我試圖解析一個Apache日誌,我有問題的引用正確的語法,因爲它是一個字符串"
(雙引號),也可以有\"
裏面。什麼正則表達式會匹配除「,除外」的所有字符?
"([^"]*)"
在字符串中存在\"
時不起作用。
如何從第一個雙引號開始,然後取所有不是雙引號的字符,除非它是\"
,在這種情況下,我將它包括在內,並繼續?
我試圖解析一個Apache日誌,我有問題的引用正確的語法,因爲它是一個字符串"
(雙引號),也可以有\"
裏面。什麼正則表達式會匹配除「,除外」的所有字符?
"([^"]*)"
在字符串中存在\"
時不起作用。
如何從第一個雙引號開始,然後取所有不是雙引號的字符,除非它是\"
,在這種情況下,我將它包括在內,並繼續?
您可以使用此:
"((?:[^"]|\\")*)"
它將匹配零個或多於一個雙引號或斜線雙引號對其他任何字符,全部由雙引號包圍。
但是,如果字符串中可能存在其他轉義序列,例如如果字符串以兩個反斜槓 –
@TimPietzcker這是一個很好的觀點,我不確定這是否有必要,但值得考慮 –
大多數正則表達式引擎都傾向於將較早的替代方案與較晚的替代方案進行匹配,即使後面的替代方案總體比賽時間更長。因此,可能需要將選項序列切換爲'\\「| [^」]'或將字符類改爲'[^「\\]',以防止匹配在第一個'」處停止。 – 1983
這將匹配兩個引號與任意數量的中間轉義引號的:
"\([^"]\|\\"\)*"
首先它看起來的報價。接着它搜索零到無窮大下列:
不,它不會。你有太多的逃生。 –
@ p.s.w.g:不適用於POSIX BRE,其*可能是OP用於解析其Apache日誌的東西。 –
@TimPietzcker夠公平的。沒有OP的進一步澄清,很難知道正確的模式應該是什麼。 –
莫不是串中其它逃逸,例如"hello \\"
?在這種情況下,你需要一個更一般的方法:
"((?:\\.|[^"\\])*)"
+1,但我認爲捕獲組是有原因的。我建議用'('...')'將所有內容都包含在引號內。 –
這個怎麼樣?一個負回顧後排除收盤"
"(.+?)(?<!\\)"
是否使用的是正則表達式引擎前
\
? –等待!我剛剛檢查過'python3'的're'模塊。 ''([^「] *)」'似乎工作正常。 – rnbcoder
歡迎來到堆棧溢出。如果這些答案中的任何一個解決了您的問題,請接受您最能解決您面臨的問題。爲了有利於未來可能有同樣問題的其他人,以及讓本網站的其他人知道您的問題已得到解決。此外,一旦您獲得了足夠的聲望(15個或更多),請提供任何答案它幫助你或者你認爲寫得非常好,即使它不是你最終使用的解決方案。 –