Type de graphique ruby-appendix-V (rubular)

!Mac OS X-10.15.7!ruby-2.7.1p83

Expression régulière

Une expression régulière est un outil pratique pour extraire les informations de caractère. Avez-vous déjà été frustré d'essayer de vous en souvenir? Je n'ai pas pu utiliser RegExp depuis plus de 10 ans, j'ai donc essayé de nombreux livres, mais j'ai abandonné en cours de route. Mais vous savez. Vous pouvez l'utiliser en seulement 10 minutes sur http://rubular.com. L'astuce est, après tout, TDD.

img
Écran rubulaire

Regardez l'écran Rubular. Mettez l'expression régulière en haut. Placez la chaîne de test en bas à gauche. Ensuite, le résultat de l'extraction apparaîtra sur la droite.

D'abord comme chaîne de test

#+qiita_id: daddygongon

Entrez s'il vous plait.

Je vais éliminer daddygongon à partir de maintenant. La chaîne capture tout ce qui est inclus

(.+)

Il est sorti avec. Un '.' Pour tout caractère unique et un (+) pour un ou plusieurs sont inclus. Veuillez penser que je vais supprimer les personnages ennuyeux à partir de maintenant. Avec un peu d'essais et d'erreurs

:\s*(.+)

Seul daddygongon pourrait-il être éliminé pour une raison quelconque?

A incorporer au rubis

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

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

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

Etc. Chacun a quelques caractéristiques, mais cela fonctionne quand cela fonctionne. Quand ça ne marche pas. .. ..

Il est facile de penser que vous devez vous souvenir de beaucoup d'expressions régulières, mais elles ne sont constituées que des éléments résumés dans la référence rapide Regex. Généralement classés, il s'agit du spécificateur de plage (colonne supérieure gauche), du spécificateur de position (colonne inférieure gauche), du spécificateur de caractère (colonne du milieu) et du spécificateur de quantité (colonne de droite). De plus, il sera extrait avec des parenthèses (). Tout ce que vous avez à faire est de faire des essais et des erreurs en regardant l'anchocolat. Comment ça va, TDD?

Extraction de données à partir de fichiers

Il existe une bibliothèque dédiée pour la lecture de fichiers formatés couramment utilisés tels que yaml et json. Il est facile à utiliser et vous pouvez l'utiliser immédiatement avec un peu de google. Le problème doit être pré-formaté pour cela. Je voudrais donc vous présenter une méthode plus générale.

C'est une méthode pratique lorsque beaucoup de syntaxe compliquée est répétée [^ RubyBestPractice]. Le plus courant est un bloc de blocs entouré de mots-clés comme indiqué ci-dessous.

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

Il n'y a peut-être pas de fin.

Dans un tel cas, il est pratique d'extraire les données tout en jugeant si elles sont à l'intérieur ou à l'extérieur du bloc comme suit.

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

L'état (dans "FontMetircs", ou autre) est stocké dans la section et traité séquentiellement.

Pour ceux qui lisent les données

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

Avec ce sentiment, les contenus à lire sont répartis selon les cas.

J'utilise un automate ou une machine à états finis qui est sorti dans la classe du compilateur. Vous créez un analyseur simple.

Références

[^ RubyBestPractice]: Ruby Best Practices-Professional Code and Techniques, Gregory Brown (Auteur), Masayoshi Takahashi (traduit), Takashi Sasai (traduit), O'Reilly Japan (2010/3/26), Ruby Best Practices par Gregory T Brown, O'Reilly,


Recommended Posts

Type de graphique ruby-appendix-V (rubular)
Type de graphique Rubis
Type de graphique ruby-appendix-III (bundler)
Type de graphique ruby-I (met)
Type de graphique ruby-appendix-IV (rake)
Type de graphique ruby-appendix-VI (thor, rubocop)
Type de graphique ruby-appendix-I (bash + emacs)