2012-12-01 32 views
0

我在工作中遇到了以下正則表達式。它有什麼作用?這個複雜的正則表達式做什麼

,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\")) 

要理解它,我把它分成以下幾部分

,

  • (?=

    • , =匹配一切=其次

    • (?:[^\"]*\"[^\"]*\")* =任何有不不匹配",然後是",其次是與"不符的任何內容,然後是"。例如,1111 「AAAAA」

    • (?![^\"]*\") = BUT後面沒有任何不"和匹配"

    換句話說,匹配任何有,接着爲無論11111"111" OR隨後""

    使用上述表達式的用例,僅用於標記字符串,由,分隔,但我假設作者爲某些更通用的東西而構建。

    任何人都可以提供比上面更簡單的解釋嗎?

    上述表達式用於將表達式分配給boost :: regex()。

    UPDATE: 事實上,它正在搜索「」逗號,用下面的約束

    1. 有偶數以下逗號

    2. 但「這是好的,它是不是好有一個「逗號

    例如,考慮後面的字符串:一,‘H,W’,23

    第一「」被匹配,因爲它具有下面的偶數的‘(’H,W‘)

    第二’,「在...之間‘h時,中,w’是不是因爲第二個表達式的匹配的(?![^ \「] * \」),它表示一個「,」不應該跟一個單一的「

    最後最後的」,「匹配。

    最後的結果將是2,

  • +0

    我調整了您的問題的格式,使其不太模糊,更易於閱讀。最重要的是,最外層的'(''和'「)'*不是正則表達式的一部分。另外,請注意第二個前視是第一個*裏面*。請檢查一下,看看我是否有其餘的權利。 –

    回答

    2

    看起來它會匹配任何逗號,但前提是有偶數個是逗號後"字符。

    , - 一個逗號。

    (?= - 其次...

    (?:[^\"]*\"[^\"]*\")* - 任何串中的標記"結束和含有"馬克總數爲偶數,或空字符串,

    (?![^\"]*\") - 並且不存在其他"稍後在字符串中標記。

    )要關閉(?=

    如果我們已經知道整個輸入字符串的字符總數爲",但不存在嵌套或轉義引號,引號之間的逗號不應被視爲分隔符,這可能很有用。例如,給定輸入

    25,"Hello, world!","More text",123.45 
    

    正則表達式不應該匹配Hello和world之間的逗號,而應該匹配其他三個逗號。

    +0

    最後一個(?![^ \「] * \」)的用法是什麼?如果丟失最後一部分,我會失去什麼 – Jimm

    +0

    前瞻的第一部分匹配偶數的引號,但並不能保證這就是全部。在字符串的其餘部分中可能還有一個引號,所以你必須檢查它。這就是內在的超前性,所以它是必不可少的。 –