2

说到正则表达式,我似乎有一个心理障碍,所以我希望你能帮助我。

我有一个具有这种格式的字符串

.* :: .* :: .*

但有时是这样的:

.* :: .*

我想捕捉前两组字符,像这样

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

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

谢谢

4

3 回答 3

2

这就是你想要的:

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

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

编辑:

.*?是非贪婪的 ,.*即它匹配尽可能少的通配符。这将阻止第一组匹配前两个模式。

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

于 2012-12-10T03:14:05.770 回答
1

这样的事情呢?

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

匹配后面的两个东西::,最后一个可以有一个可选的::

于 2012-12-10T03:19:04.537 回答
1

知道了!

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

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

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

(.*?)

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

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

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

  • “ABC :: DEF”
  • "ABC :: DEF :: GHI"
  • "A:B:C :: D:E:F" (this lets single : be in the texts between ::)
  • "A:B:C :: D:E:F :: G:H:I" (this lets single : be in the texts between ::)
于 2012-12-10T22:13:26.160 回答