Ruby 如何在第二组特定图案上拆分此字符串?

Ruby 如何在第二组特定图案上拆分此字符串?,ruby,string,Ruby,String,我有以下字符串: @snippet.diff.body => "@@ -1827,7 +1827,7 @@ def has_and_belongs_to_many(name, scope = nil, **options, &extension)\n \n builder = Builder::HasAndBelongsToMany.new name, self, options\n \n- join_model = builder.thro

我有以下字符串:

 @snippet.diff.body
=> "@@ -1827,7 +1827,7 @@ def has_and_belongs_to_many(name, scope = nil, **options, &extension)\n \n           builder = Builder::HasAndBelongsToMany.new name, self, options\n \n-          join_model = builder.through_model\n+          join_model = ActiveSupport::Deprecation.silence { builder.through_model }\n \n           const_set join_model.name, join_model\n           private_constant join_model.name\n
@@ -1856,7 +1856,7 @@ def destroy_associations\n             hm_options[k] = options[k] if options.key? k\n           end\n \n-          has_many name, scope, hm_options, &extension\n+          ActiveSupport::Deprecation.silence { has_many name, scope, hm_options, &extension }\n           _reflections[name.to_s].parent_reflection = habtm_reflection\n         end\n       end"
基本上,我想将这个字符串从第一个“特殊部分”拆分到第二个特殊部分,其中“特殊部分”(或子字符串)可以由如下字符串标识:
@-1856,7+1856,7@

因此,使用上面的字符串,我希望得到:

string1 = "@@ -1827,7 +1827,7 @@ def has_and_belongs_to_many(name, scope = nil, **options, &extension)\n \n           builder = Builder::HasAndBelongsToMany.new name, self, options\n \n-          join_model = builder.through_model\n+          join_model = ActiveSupport::Deprecation.silence { builder.through_model }\n \n           const_set join_model.name, join_model\n           private_constant join_model.name\n"

string2 = "@@ -1856,7 +1856,7 @@ def destroy_associations\n             hm_options[k] = options[k] if options.key? k\n           end\n \n-          has_many name, scope, hm_options, &extension\n+          ActiveSupport::Deprecation.silence { has_many name, scope, hm_options, &extension }\n           _reflections[name.to_s].parent_reflection = habtm_reflection\n         end\n       end"
请注意,
@
之间的数字并不总是相同的……关键是在标记此字符串开头的两组
@
之间会有一些子字符串。然后,另一组标记此字符串的结束,以及下一个字符串的开始。

使用split和正向前瞻 您可以在以@@开头的每一行拆分:

body.split(/(?=^@@)/)
您需要一个字符串来保持
@
在字符串中:这样,原始字符串将在一行的开头拆分,就在
@
之前

在之前先进行分割和切片 您可以在
/@../
之前的每一行和每一片上进行拆分:

body = "@@ -1827,7 +1827,7 @@ def has_and_belongs_to_many(name, scope = nil, **options, &extension)\n \n           builder = Builder::HasAndBelongsToMany.new name, self, options\n \n-          join_model = builder.through_model\n+          join_model = ActiveSupport::Deprecation.silence { builder.through_model }\n \n           const_set join_model.name, join_model\n           private_constant join_model.name\n
@@ -1856,7 +1856,7 @@ def destroy_associations\n             hm_options[k] = options[k] if options.key? k\n           end\n \n-          has_many name, scope, hm_options, &extension\n+          ActiveSupport::Deprecation.silence { has_many name, scope, hm_options, &extension }\n           _reflections[name.to_s].parent_reflection = habtm_reflection\n         end\n       end"

body.each_line.slice_before(/^@@[\d\+\-, ]+@@/).map(&:join)

这两个方法都返回一个包含2个字符串的数组,并与示例一起使用。第二个可能比第一个更健壮。

类似于
str.scan(/^@.+@[^@]+/)
的东西可能会有帮助。@sagarpandya82据我所知,
[^@]
只是
[^@]
。因此,如果显示的代码有实例变量,它将不起作用。是否有任何方法可以不在换行符处拆分,然后在换行后重建字符串?那感觉像是不必要的工作。@marcamillion:Updated。请看第一个变体。很好……第一个变体很好用。你能简单地解释一下它是怎么做的吗?只是为了完整。换句话说,
?=^
是否将正则表达式限制为仅在每行开头查找跟随这些字符的模式?marcamillion,回想一下,lookarounds(这里的正向lookahead
(?=^@)
)是零宽度,这意味着它们不捕获字符。实际上,这个正则表达式将字符串在两个字符之间的某个位置进行分割,该位置紧靠
^@@@……
。环顾四周进行拆分有多种应用。例如“xxxxx”.split(/(?=xxx)/)#=>[“x”,“x”,“xxx”]`。