如何检测此线的存在?

时间:2017-03-13 07:13:32

标签: ruby string

这个问题与前一篇asked here有关,请原谅我,如果大部分语言看似相似的话。

我有一个包含多行的字符串。我正在做的是检查每一行的具体特征,然后相应地对其进行处理。

  • 一个特征是该行以+-开头。这很好。
  • 另一个特点是,如果它只包含\n,Ilya帮我弄清楚如何检测这些线条,这样做很好。
  • 我尝试检测的最后一种字符串是那些不符合上述任何条件的字符串,但是以-+开头的行后面。

脱离上下文,这是我想要找到的有效字符串的示例:" end\n",

但是,这是一个更完整的示例,位于以+-开头的行之后。

"+          Reflection.add_reflection self, name, reflection\n",
 "         end\n",
 " \n",
 "-        habtm_reflection = ActiveRecord::Reflection::HasAndBelongsToManyReflection.new(name, scope, options, self)\n",

在这个特定的例子中,我试图找出第二行。

这是一个实例,其中与纯字符串匹配参数匹配的字符串将被取消资格,因为它们来自以-+开头的字符串。

 "     #\n",
 "     # All of the association macros can be specialized through options. This makes cases\n",
 "     # more complex than the simple and guessable ones possible.\n",
 "-    module ClassMethods\n",

我希望这很清楚。

修改1

为我所寻找的内容提供更清晰的信息。基本上我已经将字符串分成了一堆行,然后我在每一行迭代。

所以这就是我所做的:

  <% diff.body.lines.each do |dl| %>
    <% if dl.start_with?("-") %>
    <% elsif dl.start_with?("+") %>
    <% elsif dl.strip.empty? %>
    <% end %>
  <% end %>

所以我想做的是修改上面的if语句集以适应这种最新的行检查,或者通过添加另一个elsif条件找到一些方法来检查它。虽然考虑到我需要知道上面的行发生了什么,但我没有看到如何在不修改if声明的情况下这样做。

1 个答案:

答案 0 :(得分:2)

str = [
  "+          Reflection ...\n",
  "         end\n",
  " \n",
  "-        habtm_reflection = ...\n"].join

str[/(^[+-].*$)\n(?!\n)(^[^+-].*$)/, 2]
#⇒ "         end"

正则表达式基本上会查找以+ ot -(带(^[+-].*$))开头的行,跳过\n,然后匹配该行不是以+-(^[^+-].*$)之一)开始的。)