Diagrammtyp Ruby-Anhang-V (Rubular)

!Mac OS X-10.15.7!ruby-2.7.1p83

Regulären Ausdruck

Ein praktisches Werkzeug zum Extrahieren von Zeicheninformationen ist ein regulärer Ausdruck. Warst du jemals frustriert, dich daran zu erinnern? Ich konnte RegExp seit mehr als 10 Jahren nicht mehr verwenden, also habe ich viele Bücher ausprobiert, aber ich habe den Weg aufgegeben. Aber du weißt. Sie können es in nur 10 Minuten unter http://rubular.com verwenden. Der Trick ist schließlich TDD.

img
Rubular Bildschirm

Schauen Sie sich den Rubular-Bildschirm an. Setzen Sie den regulären Ausdruck oben. Legen Sie den Teststring unten links ein. Dann erscheint das Extraktionsergebnis rechts.

Zuerst als Teststring

#+qiita_id: daddygongon

Bitte eingeben.

Ich werde von nun an Daddygongon ausschalten. Die Zeichenfolge erfasst alles, was eingeschlossen ist

(.+)

Es wird mit herausgenommen. Ein '.' Für ein einzelnes Zeichen und ein (+) für ein oder mehrere sind enthalten. Bitte denken Sie, dass ich die nervigen Zeichen von nun an entfernen werde. Mit ein wenig Versuch und Irrtum

:\s*(.+)

Konnte nur Daddygongon aus irgendeinem Grund herausgenommen werden?

In Rubin einarbeiten

line =~ /:\s*(.+)/
p $1

res = line.scan(/:\s*(.+)/)
p res[0] unless res

m = line.match(/:\s*(.+)/)
p m[1] unless m

Und so weiter. Jedes hat ein paar Eigenschaften, aber es funktioniert, wenn es funktioniert. Wenn es nicht funktioniert. .. ..

Es ist leicht zu glauben, dass Sie sich viele reguläre Ausdrücke merken müssen, aber sie bestehen nur aus den Elementen, die in der Regex-Kurzreferenz zusammengefasst sind. Allgemein klassifiziert sind sie Bereichsspezifizierer (obere linke Spalte), Positionsspezifizierer (untere linke Spalte), Zeichenspezifizierer (mittlere Spalte) und Mengenspezifizierer (rechte Spalte). Außerdem wird es mit Klammern () extrahiert. Alles, was Sie tun müssen, ist Versuch und Irrtum zu machen, während Sie die Ankerschokolade betrachten. Wie ist es, TDD?

Daten aus Dateien extrahieren

Es gibt eine spezielle Bibliothek zum Lesen aus häufig verwendeten formatierten Dateien wie yaml und json. Es ist einfach zu bedienen und Sie können es sofort mit ein wenig Google verwenden. Das Problem muss dafür vorformatiert werden. Daher möchte ich eine allgemeinere Methode vorstellen.

Dies ist eine bequeme Methode, wenn viele komplizierte Syntaxen wiederholt werden [^ RubyBestPractice]. Am häufigsten wird ein Block von Blöcken verwendet, die von Schlüsselwörtern umgeben sind (siehe unten).

StartCharMetrics 315
C 32 ; WX 278 ; N space ; B 0 0 0 0 ;
C 33 ; WX 278 ; N exclam ; B 90 0 187 718 ;
C 34 ; WX 355 ; N quotedbl ; B 70 463 285 718 ;
C 35 ; WX 556 ; N numbersign ; B 28 0 529 688 ;
C 36 ; WX 556 ; N dollar ; B 32 -115 520 775 ;
....
EndCharMetrics

Es kann kein Ende geben.

Eine bequeme Methode in solchen Fällen besteht darin, Daten zu extrahieren, während wie folgt bestimmt wird, ob sie sich innerhalb oder außerhalb des Blocks befinden.

setion = []
File.foreach(file_name) do |line|
  case line
  when /^Start(\w+)/
    section.push $1
    next
  when /^End(\w+)/
    section.pop
    next
  end
end

Der Status (in "FontMetircs" oder anderen) wird in dem Abschnitt gespeichert und nacheinander verarbeitet.

Für diejenigen, die die Daten lesen

case section
when ["FontMetrics", "CharMetrics"]
  next unless line =~ /^CH?\s/

  name                  = line[/\bN\s+(\.?\w+)\s*;/, 1]
  @glyph_widths[name]   = line[/\bWX\s+(\d+)\s*;/, 1].to_i
  @bounding_boxes[name] = line[/\bB\s+([^;]+);/, 1].to_s.rstrip
when ["FontMetrics", "KernData", "KernPairs"]
  next unless line =~ /^KPX\s+(\.?\w+)\s+(\.?\w+)\s+(-?\d+)/
  @kern_pairs[[$1, $2]] = $3.to_i
when ["FontMetrics", "KernData", "TrackKern"], ["FontMetrics", "Composites"]
  next
else
  parse_generic_afm_attribute(line)
end

Mit diesem Gefühl werden die zu lesenden Inhalte je nach Fall aufgeteilt.

Ich benutze ein Auto-Hammel oder eine Finite-State-Maschine, die in der Compiler-Klasse herauskam. Sie erstellen einen einfachen Parser.

Verweise

[^ RubyBestPractice]: Ruby Best Practices - Professioneller Code und Techniken, Gregory Brown (Autor), Masayoshi Takahashi (übersetzt), Takashi Sasai (übersetzt), O'Reilly Japan (26.03.2010), Ruby Best Practices von Gregory T. Brown, O'Reilly,


Recommended Posts

Diagrammtyp Ruby-Anhang-V (Rubular)
Diagrammtyp Ruby
Diagrammtyp Ruby-Anhang-III (Bündler)
Diagrammtyp Ruby-I (Puts)
Diagrammtyp Rubin-Anhang-IV (Rechen)
Diagrammtyp Rubin-Anhang-VI (Thor, Rubocop)
Diagrammtyp Ruby-Anhang-I (Bash + Emacs)