Ruby-使用扫描拆分多个字符串

Ruby-使用扫描拆分多个字符串,ruby,regex,string,split,Ruby,Regex,String,Split,我有一个类似于xfooxbar的字符串,希望使用scan将其拆分为['foo','bar']。(在有人问为什么不使用split之前,真正的例子要复杂得多,在这个例子中,我还需要获取边界字符串,该字符串被split丢弃。我问这个问题是为了更多地了解扫描是如何工作的,或者是否有类似的替代方法,因为我发现这比我预期的要难。) 这不起作用,因为它会一直扫描到字符串结束: "xfooxbar".scan(/(?:x)(.*)/) > [["fooxbar"]] 问题是扫描在找到下一个模式时并没有神

我有一个类似于
xfooxbar
的字符串,希望使用
scan
将其拆分为['foo','bar']。(在有人问为什么不使用
split
之前,真正的例子要复杂得多,在这个例子中,我还需要获取边界字符串,该字符串被split丢弃。我问这个问题是为了更多地了解扫描是如何工作的,或者是否有类似的替代方法,因为我发现这比我预期的要难。)

这不起作用,因为它会一直扫描到字符串结束:

"xfooxbar".scan(/(?:x)(.*)/)
> [["fooxbar"]]
问题是扫描在找到下一个模式时并没有神奇地停止扫描,而使用(.*)使其不贪婪只会使其为空,因为没有端点。因此,我们可以添加一个端点作为下一个匹配:

"xfooxbar".scan(/(?:x)(.*)(?:x)/)
> [["foo"]]

问题是扫描显然不匹配字符串中的所有可能模式,因为它将指针保持在当前位置,并且不会回溯。因此,它在第二个边界上匹配,并将从那里恢复扫描(?:对此没有影响)。

使用如下所示的正向查找断言

irb(main):001:0> "xfooxbar".scan(/(?<=x)[^x]*/)
=> ["foo", "bar"]
irb(main):001:0>“xfooxbar”。扫描(/(?[“foo”,“bar”]

  • (?除非我遗漏了一些东西,否则这不能用一个简单的not x正则表达式来完成吗

    (我扩展了原始字符串以证明这一点)


    谢谢,它很好用。但是没有办法让它变干,只配重复的图案吗?(真正的例子是多行,如果我找不到更多关于这方面的信息,那么必须使用感谢,接受这个,并将添加一个单独的问题,这将是一个麻烦和棘手的问题。在这里问是的,有效。我只是在想一个更复杂的模式。我真的想保持干燥,不必指定x,然后再指定“不是x”。
    pry(main)> "nonexfooxbarxgreedy\ngreedyxgoose".scan(/x([^x]*)/)
    => [["foo"], ["bar"], ["greedy\ngreedy"], ["goose"]]