带分隔符和可选部分的正则表达式

时间:2012-12-10 03:12:50

标签: objective-c regex optional

在正则表达式方面,我似乎有心理障碍,所以我希望你能帮助我。

我有一个具有此格式的字符串

.* :: .* :: .*

但有时候会这样:

.* :: .*

我想捕获前两组字符,比如

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

但我不知道如何修改我的表达式,以便最后的::和字符是可选的。我尝试过使用括号和?,但我根本无法让它工作。

由于

3 个答案:

答案 0 :(得分:2)

这就是你想要的:

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

您访问的捕获组是1,2和4(其中4可能为空)。

编辑:

.*?是非贪婪的.*,即它匹配尽可能少的外卡字符。 这会阻止第一组匹配前两种模式。

如果您知道该模式不包含.*,则另一个选项是将[^:]*替换为:

答案 1 :(得分:1)

这样的事情怎么样?

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

匹配两个内容后跟::,最后一个可以选择::

答案 2 :(得分:1)

知道了!

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

以下是其工作原理的细分:

- >这会隔离第一批::之前的第一批字符,并将其保存到$ 1组。

(.*?)

- >接下来,这个块做了两件事。首先,它使用。*?获取第二批角色。在此之后,零宽度正向前瞻断言(?= :: | $)要求字符以另一个::或$结尾,即文本的结尾,但不包括它们在匹配组中,这意味着只有第二批字符保存到$ 2。

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

我在Objective-C中对这些字符串进行了成功测试:

  • “ABC :: DEF”
  • “ABC :: DEF :: GHI”
  • “A:B:C :: D:E:F”(这让单一:在:: :)之间的文本中
  • “A:B:C :: D:E:F :: G:H:I”(这让单一:在:: :)之间的文本中