Работа с текстом в Ruby - PullRequest
       1

Работа с текстом в Ruby

0 голосов
/ 24 февраля 2010

Я пытаюсь написать счетчик слов для файлов LyX.

Жизнь почти очень проста, так как большинство строк, которые нужно игнорировать, начинаются с \ (я готов предположить, что текстовые строки не начинаются с обратной косой черты) - однако есть некоторые строки, которые выглядят как настоящий текст это не так, но они заключены в \begin_inset и \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

Есть ли в ruby ​​быстрый способ вырезать (наименьшее количество) текста между двумя маркерами? Я представляю себе, что регулярные выражения - это путь вперед, но я не могу понять, какими они должны быть.

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 24 февраля 2010

Есть ли в ruby ​​быстрый способ разделить (наименьшее количество) текст между двумя маркерами?

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"
1 голос
/ 24 февраля 2010

gsub может быть дорогим для более длинных файлов (если вы читаете весь файл как строку)

поэтому, если вам все равно придется разбить его на части, вы можете использовать анализатор с сохранением состояния

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 голосов
/ 24 февраля 2010

Вы должны посмотреть на str.scan () . Предполагая, что ваш текст находится в переменной s, что-то вроде этого должно работать:

s_strip_inset = s.sub!(/\\begin_inset.*?\\end_inset/, "")
word_count = s_strip_inset.scan(/(\w|-)+/).size
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...