2012-12-10 66 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