2017-03-13 4 views
1

Diese Frage bezieht sich auf eine vorherige Ich nur asked here, also vergib mir, wenn viel der Sprache ähnlich scheint.Wie erkenne ich das Vorhandensein dieser Linie?

Ich habe eine Zeichenfolge, die mehrere Zeilen hat. Ich überprüfe jede Zeile auf bestimmte Eigenschaften und behandle sie dann entsprechend.

  • Ein Merkmal ist, wenn die Leitung mit einem + oder - beginnt. Das funktioniert gut.
  • Ein anderes Merkmal ist, wenn es nichts als eine \n enthält, und Ilya half mir herauszufinden, wie diese Linien zu erkennen, so dass es gut ist.
  • Der letzte Typ der Zeichenfolge, die ich zu erkennen versuche, ist jene, die keinem der oben genannten Kriterien entspricht, aber NACH einer Zeile kommt, die entweder mit - oder + beginnt.

aus dem Kontext genommen, ist dies ein Beispiel für eine gültige Zeichenfolge ist, würde ich finden mag: " end\n",

Allerdings ist hier ein vollständigeres Beispiel im Kontext nach einer Linie zu sein, die mit + beginnen oder -.

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

In diesem bestimmten Beispiel versuche ich, die zweite Zeile auszuwählen.

Hier ist eine Instanz, in der Zeichenfolgen, die mit dem Parameter für die reine Zeichenfolgenabgleichung übereinstimmen, disqualifiziert werden, da sie BEFORE einer Zeichenfolge entsprechen, die mit - oder + beginnt.

"  #\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", 

Ich hoffe, das ist klar.

Edit 1

Um mehr Klarheit zu schaffen, was ich suche. Im Grunde habe ich die Saite in eine Reihe von Linien zerlegt und dann wiederhole ich jede Zeile.

So ist es das, was ich getan habe:

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

Also, was soll ich tun, ist, die oben Satz von if Aussagen entweder zu modifizieren letzte Zeile Check aufzunehmen, oder einen Weg finden, es zu überprüfen, indem Sie Hinzufügen eines weiteren elsif Zustand .... obwohl in Anbetracht dessen, dass ich wissen muss, was mit der Zeile oben passiert ist, sehe ich nicht, wie das zu tun, ohne diese if Anweisung zu ändern.

+0

Woher kommt diese Datei? – Stefan

Antwort

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

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

Der reguläre Ausdruck sieht grundsätzlich die Linie nach oben, die mit gestartet wird entweder + ot - (mit (^[+-].*$)), die \n überspringt und dann passt die Zeile, die nicht mit einem der + oder - (mit (^[^+-].*$) gestartet.)

+0

Können Sie bitte erklären, was das macht? – marcamillion

+0

Oh, ich sehe, was du machst, vielleicht funktioniert es nicht so, wie ich es mir vorgestellt habe.Das Problem ist, dass ich diese Zeichenfolge Zeile für Zeile analysiere. Ok, hang weiter, ich muss die Frage neu schreiben, um besser zu reflektieren, wie ich jede Zeile analysiere. – marcamillion

+0

Das ist ziemlich klar, regulärer Ausdruck, ich bin im Zweifel, was hier geklärt werden könnte. – mudasobwa

Verwandte Themen