2015-12-06 5 views
0

Mon projet lit de nombreux fichiers (ces fichiers ont un titre et des sections) et devrait trouver le titre des fichiers qui contiennent un acronyme. Ceci est ma classe docs:Comment trouver un acronyme dans un texte?

class Doc 
    def initialize(id, secciones) 
    @id, @secciones = id, secciones 
    end 
    def to_s 
    result = "" + @id.to_s + "\n" + @secciones.to_s 
    return result 
    end 
    def tiene_acronimo(acr) 
    puts "a ver si tiene acronimos el docu.." 
    tiene_acronimo = false 
    secciones.each do |seccion| 
     if seccion.tiene_acronimo(acr) 
     tiene_acronimo = true 
     end 
    end 
    return tiene_acronimo 
    end 
    attr_accessor :id 
    attr_accessor :secciones 
end 

Et cette mes sections classe:

class Section 
    def initialize() 
    @title = "" 
    @text = "" 
    end 
    def tiene_acronimo(acr) 
    return title.include?(acr) || text.include?(acr) 
    end 
end 

Et cette ma méthode:

def test() 
    results = Array.new 
    puts "Dame el acronimo" 
    acr = gets 
    documentos_cientificos.each do |d| 
    if d.tiene_acronimo(acr) 
    results << d 
    end 
end 

La méthode devient un acronyme et devrait trouver tous les documents qui contiennent il. La méthode inclue? [sic] gère l'upcase et renvoie true si les documents contiennent une sous-chaîne comme l'acronyme. Par exemple:

Multiple sclerosis (**MS**), also known as # => `true` 
Presenting signs and sympto**ms** # => `false` (but `include?` returns `true`) 

Comment trouver plus facilement un acronyme?

Répondre

1

Vous pouvez utiliser une expression régulière avec la fonction de correspondance. L'expression régulière suivante trouvera une correspondance si le contenu contient le mot COMPLET fourni. Il va ignorer les sous-chaînes, et il sera sensible à la casse.

arc = "MS" 
title = "Multiple sclerosis (MS), also known as" 
text = "Presenting signs and symptoms" 

title.match(/\b#{Regexp.escape(acr)}\b/) # => #<MatchData "MS"> 
text.match(/\b#{Regexp.escape(acr)}\b/) # => nil 

ou équivalente

title.match(/\b#{Regexp.escape(acr)}\b/).to_a.size > 0 # => true 
text.match(/\b#{Regexp.escape(acr)}\b/).to_a.size > 0 # => false 

... vous pouvez donc redéfinir votre fonction:

def tiene_acronimo(acr) 
    regex_to_match = /\b#{Regexp.escape(acr)}\b/ 
    has_acr = false 
    if (title.match(regex_to_match)) || (text.match(regex_to_match)) 
    has_acr = true 
    end 

    return has_acr 
end 
+0

Merci! Je suis nouveau à ruby, ce code fonctionne quand j'ai déclaré la var acr = "MS", mais quand je demande la valeur sur l'écran ("acr = gets" et je mets MS) ne fonctionne pas. C'est bizarre parce que j'entre la même valeur ... c'est comme si ce sont des formats différents ... merci :) –

+0

Lorsque vous utilisez get, un caractère de nouvelle ligne est ajouté à la fin de l'entrée. Vous pouvez changer la ligne 'regex_to_match = /\b#{Regexp.escape(acr)} \ b /' à 'regex_to_match = /\b#{Regexp.escape(acr.strip)} \ b /' pour se débarrasser de la nouvelle ligne caractère et juste vérifier contre le texte entré. –