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”]`。