对于正则表达式,我似乎有一个心理障碍,所以我希望你能帮助我。带分隔符和可选部分的正则表达式
我有了这种格式
.* :: .* :: .*
但有时像这样的字符串:
.* :: .*
我想捕捉的第一2组字符,这样
(.*) :: (.*) :: .*
但我不知道如何修改我的表达式,以便last ::和characters是可选的。我尝试过使用圆括号和?
,但我无法按需要使其工作。
感谢
对于正则表达式,我似乎有一个心理障碍,所以我希望你能帮助我。带分隔符和可选部分的正则表达式
我有了这种格式
.* :: .* :: .*
但有时像这样的字符串:
.* :: .*
我想捕捉的第一2组字符,这样
(.*) :: (.*) :: .*
但我不知道如何修改我的表达式,以便last ::和characters是可选的。我尝试过使用圆括号和?
,但我无法按需要使其工作。
感谢
Got it!
(.*?) :: (.*?(?= :: |$))
这里是它如何工作的故障:
- >隔离了首批人物前第一::并将其保存到组$ 1中。
(.*?)
- >接下来,这个块做了两件事。首先,它使用。*?获得第二批人物。在此之后,零宽度正向先行断言(?= :: | $)要求字符以另一个::或$为结尾的文本结束,但不包括它们在匹配组中,这意味着只有第二批字符被保存到$ 2。
(.*?(?= :: |$))
我在Objective-C测试针对这些串的成功:
这就是@Petar伊万诺夫最初的建议,但你可以通过我的第一个评论看到,它并没有工作。 – coopersita
我能够在Objective-C中测试时找到完全符合您要求的RegEx,请参阅我的修订答案。 – Anton
是的,这完全做到了。你是个天才!谢谢! – coopersita
这是你想要什么:
([^:]*) :: ([^:]*) (:: ([^:]*))?
拍摄的组访问,然后是1,2和4(4可能是空的)。
编辑:
的.*?
是非贪婪.*
,即它尽可能少的通配符匹配越好。 这会阻止第一组匹配前两种模式。
如果您知道该模式不包含:
,另一种选择是将.*
替换为[^:]*
。
关闭,但第一组和第二组合并成一个。 1是'。* ::。*',2是最后一个'。*'。它只有在最后一个模式丢失时才能正常工作。 – coopersita
嗯,是的,我看...让我改正它然后 –
更接近,但现在2只捕获第一个字... – coopersita
这样的事情呢?其次::
(.* ::){2}(?:::)?
比赛两件事情,最后能有一个可选的::
。
也关闭,但它只适用于我有3组字符和2个分隔符。它还在我的字符串末尾附加了'::'。 – coopersita
请在下面查看我的修改答案。我得到它的工作和充分测试。与其他答案不同,它还允许single:在没有问题的字符串中,只查找double ::。 – Anton