2010-02-24 3 views
0

J'essaie d'écrire un compteur de mots pour les fichiers LyX.Manipulation du texte dans Ruby

La vie est presque très simple car la plupart des lignes qui doivent être ignorées commencent par \ (je suis prêt à faire l'hypothèse qu'aucune ligne textuelle ne commence par des barres obliques inverses) - cependant, certaines lignes ressemblent à du vrai texte. ne sont pas, mais ils sont entourés par \begin_inset et \end_inset:

I'm genuine text. 

\begin_inset something 
I'm not real text 
Perhaps there will be more than one line! Or none at all! Who knows. 
\end_inset 

/begin_layout 
I also need to be counted, and thus not removed 
/end_layout 

est-il un moyen rapide de Ruby pour dépouiller les (la plus petite quantité de) texte entre deux marqueurs? J'imagine que les expressions régulières sont la voie à suivre, mais je n'arrive pas à comprendre ce qu'elles devraient être.

Merci à l'avance

Répondre

3

est-il un moyen rapide de Ruby pour dépouiller les (la plus petite quantité de) texte entre deux marqueurs?

str = "lala BEGIN_MARKER \nlu\nlu\n END_MARKER foo BEGIN_MARKER bar END_MARKER baz" 
str.gsub(/BEGIN_MARKER.*?END_MARKER/m, "") 
#=> "lala foo baz" 
+0

D'oh! * coups de tête * bien sûr - merci! –

1

gsub pourrait être coûteux pour les fichiers plus (si vous lisez dans le fichier entier sous forme de chaîne)

donc si vous devez morceau de toute façon, vous pouvez utiliser un stateful analyseur

in_block = false 
File.open(fname).each_line do |line| 
if in_block 
    in_block = false if line =~ /END_MARKER/ 
    next 
    else 
    in_block = true if line =~ /BEGIN_MARKER/ 
    next 
    end 
    count_words(line) 
end 
0

Vous devriez regarder str.scan(). En supposant que votre texte est dans la variable s, quelque chose comme ça devrait fonctionner:

s_strip_inset = s.sub!(/\\begin_inset.*?\\end_inset/, "") 
word_count = s_strip_inset.scan(/(\w|-)+/).size 
Questions connexes