说到正则表达式,我似乎有一个心理障碍,所以我希望你能帮助我。
我有一个具有这种格式的字符串
.* :: .* :: .*
但有时是这样的:
.* :: .*
我想捕捉前两组字符,像这样
(.*) :: (.*) :: .*
但我不知道如何修改我的表达式,以便最后一个 :: 和字符是可选的。我试过使用括号 and ?
,但我无法让它按需要工作。
谢谢
说到正则表达式,我似乎有一个心理障碍,所以我希望你能帮助我。
我有一个具有这种格式的字符串
.* :: .* :: .*
但有时是这样的:
.* :: .*
我想捕捉前两组字符,像这样
(.*) :: (.*) :: .*
但我不知道如何修改我的表达式,以便最后一个 :: 和字符是可选的。我试过使用括号 and ?
,但我无法让它按需要工作。
谢谢
这就是你想要的:
([^:]*) :: ([^:]*) (:: ([^:]*))?
然后您访问的捕获组是 1、2 和 4(其中 4 可能为空)。
编辑:
.*?
是非贪婪的 ,.*
即它匹配尽可能少的通配符。这将阻止第一组匹配前两个模式。
如果您知道该模式不包含,另一种选择是替换.*
为.[^:]*
:
这样的事情呢?
(.* ::){2}(?:::)?
匹配后面的两个东西::
,最后一个可以有一个可选的::
。
知道了!
(.*?) :: (.*?(?= :: |$))
以下是其工作原理的细分:
-> 这会在第一个 :: 之前隔离第一批字符并将其保存到 $1 组。
(.*?)
-> 接下来,这个块做两件事。首先,它使用 .*? 获取第二批字符。在此之后,零宽度正向预测断言 (?= :: |$) 要求字符以另一个 :: 或 $ 结尾,即文本的结尾,但不将它们包含在匹配组中,这意味着只有第二批字符被保存到 $2。
(.*?(?= :: |$))
我在 Objective-C 中对这些字符串进行了成功测试: