2012-12-10 116 views
2

對於正則表達式,我似乎有一個心理障礙,所以我希望你能幫助我。帶分隔符和可選部分的正則表達式

我有了這種格式

.* :: .* :: .* 

但有時像這樣的字符串:

.* :: .* 

我想捕捉的第一2組字符,這樣

(.*) :: (.*) :: .* 

但我不知道如何修改我的表達式,以便last ::和characters是可選的。我嘗試過使用圓括號和?,但我無法按需要使其工作。

感謝

+0

請在下面查看我的修改答案。我得到它的工作和充分測試。與其他答案不同,它還允許single:在沒有問題的字符串中,只查找double ::。 – Anton

回答

1

Got it!

(.*?) :: (.*?(?= :: |$)) 

這裏是它如何工作的故障:

- >隔離了首批人物前第一::並將其保存到組$ 1中。

(.*?) 

- >接下來,這個塊做了兩件事。首先,它使用。*?獲得第二批人物。在此之後,零寬度正向先行斷言(?= :: | $)要求字符以另一個::或$爲結尾的文本結束,但不包括它們在匹配組中,這意味着只有第二批字符被保存到$ 2。

(.*?(?= :: |$)) 

我在Objective-C測試針對這些串的成功:

  • 「ABC :: DEF」
  • 「ABC DEF :: :: GHI」
  • 「A:B :C :: D:E:F「(這可以讓單個人:在以下文本之間::)
  • 」A:B:C :: D:E:F :: G:H:I「單身:在之間的文字::)
+0

這就是@Petar伊萬諾夫最初的建議,但你可以通過我的第一個評論看到,它並沒有工作。 – coopersita

+0

我能夠在Objective-C中測試時找到完全符合您要求的RegEx,請參閱我的修訂答案。 – Anton

+0

是的,這完全做到了。你是個天才!謝謝! – coopersita

2

這是你想要什麼:

([^:]*) :: ([^:]*) (:: ([^:]*))? 

拍攝的組訪問,然後是1,2和4(4可能是空的)。

編輯:

.*?是非貪婪.*,即它儘可能少的通配符匹配越好。 這會阻止第一組匹配前兩種模式。

如果您知道該模式不包含:,另一種選擇是將.*替換爲[^:]*

+0

關閉,但第一組和第二組合併成一個。 1是'。* ::。*',2是最後一個'。*'。它只有在最後一個模式丟失時才能正常工作。 – coopersita

+0

嗯,是的,我看...讓我改正它然後 –

+0

更接近,但現在2只捕獲第一個字... – coopersita

1

這樣的事情呢?其次::

(.* ::){2}(?:::)? 

比賽兩件事情,最後能有一個可選的::

+0

也關閉,但它只適用於我有3組字符和2個分隔符。它還在我的字符串末尾附加了'::'。 – coopersita