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