2012-04-13 30 views
0

我有一個正則表達式,看起來是這樣的:匹配或所有可能的部位使用NSRegularExpression

(\bee[0-9]{9}in\b)|(\bee[0-9]{9}[a-zA-Z]{2}\b) 

現在,如果輸入的字符串是ee123456789ab那麼|第二部分中的字符串相匹配。但是如果輸入字符串是ee123456789in|的第一部分消耗了整個字符串,第二部分沒有得到與字符串匹配的更改?我希望|的兩個部分的變化都匹配字符串,以便我知道兩個部分都能匹配字符串。使用正則表達式甚至可以做到這一點?

+0

這個例子沒有多大意義。 *您*已經構建了正則表達式。所以你知道*每次*第一個替代匹配,第二個也會匹配,因爲第一個正則表達式是第二個正則表達式的「子集」。爲什麼你會需要這個?你能想到一個更現實的例子,顯示你想要解決的實際問題嗎? – 2012-04-13 16:59:56

回答

1

您可以使用lookahead assertions

^(?=(ee[0-9]{9}in$)?)(?=(ee[0-9]{9}[a-zA-Z]{2}$)?) 

這將捕獲兩個\1\2匹配;如果兩者中的任何一個都爲空,則正則表達式的相應部分不匹配。

由於您正在測試整個字符串,而不僅僅是子字符串,所以我已經改變了字邊界錨以開始/結束字符串錨。

在Python:

>>> import re 
>>> r = re.compile(r"^(?=(ee[0-9]{9}in$)?)(?=(ee[0-9]{9}[a-zA-Z]{2}$)?)") 
>>> m = r.match("ee123456789ab") 
>>> m.group(1) 
>>> m.group(2) 
'ee123456789ab' 
>>> m = r.match("ee123456789in") 
>>> m.group(1) 
'ee123456789in' 
>>> m.group(2) 
'ee123456789in' 

說明:

^    # Start of string 
(?=    # Look ahead to see if it's possible to match... 
(    # and capture... 
    ee[0-9]{9}in # regex 1 
    $    # (end of string) 
)?    # (make the match optional) 
)    # End of lookahead 
(?=    # Second lookahead, same idea... 
(
    ee[0-9]{9}[a-zA-Z]{2} 
    $ 
)? 
) 
+0

完美!非常感謝答案! – 2012-04-13 19:36:15

1

這對於正則表達式來說是不可能的。如果它的任何部分匹配,則認爲匹配。你將不得不用兩個不同的表達式來做,看看是否都成功了。

+0

當然,除非你正在討論不支持lookahead的正則表達式引擎(其中很多還沒有在任何地方使用),否則它是可能的。 – 2012-04-13 17:08:05

+0

我在iOS應用程序中使用它,iOS支持lookahead。 – 2012-04-13 19:35:27

1

的或者是或不管什麼,不能圍繞該得到的。
正如@Tim所提到的,它可以通過以下方式完成:

您可以靜止不動,並多次查看同一文本。

所以,一種方法是查看每個表達式而不移動,每個表達式都是可選的。 -

(?= (ee [0-9]{9} in)?) 
(?= (ee [0-9]{9} [a-zA-Z]{3})?) 

這是不好的,因爲,雖然位置將在最後一個
表達後前進,它只會提前1字符間的位置。當在全局上下文中搜索時,它也允許重疊。在塊(還不知道它如何決定)

(?= (ee [0-9]{9} in)?) 
(?= (ee [0-9]{9} [a-zA-Z]{3})?) 
. 

發動機未優化的東西時被消耗,
進步 -

搜索可以通過消耗字符加快。

如果您還有其他表達方式,則需要將
的位置提前超過此位置,否則任何情況都不會匹配。這也可以消除
重疊匹配的文字(如果這是一個目標)。

它實際上很難避免重疊,除非你確實知道一個表達式將會比另一個表達式要長
。如果那是實際情況,那麼你總是可以做一個有條件
(如果可用)要消耗較大的文本 -

(?= (ee [0-9]{9} in)?) 
(?= (ee [0-9]{9} [a-zA-Z]{3})?) 
(?(2) \2 | \1) 

而且,如果你知道一個是另一個的子集,你可能只是這樣做 -

(?= (ee [0-9]{9} in)?) (ee [0-9]{9} [a-zA-Z]{3}) 

無論哪種方式,取決於表達式,想那麼多有進入設計
消費進入正則表達式,以避免重疊。

+0

這也是一個很好的煽動者。 – 2012-04-13 19:52:29

+0

@AnupamGodbole:你知道你可以upvote有用的答案,對吧? – 2012-04-14 07:05:16

相關問題