Как мне получить слово внутри файла в заданной позиции? - PullRequest
0 голосов
/ 07 мая 2018

Как получить слово внутри файла в заданной позиции

def get_word(file, position)
  File.each_line(file).with_index do |line, line_number|
    if (line_number + 1) == position.line_number
      # How to get a word at position.column_number ?
    end
  end
end

Это должно работать так:

Файл: message.md

Dear people:

My name is [Ángeliño](#angelino).

Bye!

Звонки: get_word

record Position, line_number : Int32, column_number : Int32

get_word("message.md", Position.new(1, 9))  # => people
get_word("message.md", Position.new(3, 20)) # => Ángeliño
get_word("message.md", Position.new(5, 3))  # => Bye!

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Может быть, это даст вам подсказку. Обратите внимание, что эта реализация никогда не обрабатывает знак препинания как часть слова, поэтому в последнем примере возвращается Bye вместо Bye!.

def get_word_of(line : String, at position : Int)
  chunks = line.split(/(\p{P}|\p{Z})/)

  edge = 0
  hashes = chunks.map do |chunk|
    next if chunk.empty?
    {chunk => (edge + 1)..(edge += chunk.size)}
  end.compact

  candidate = hashes.find { |hash| hash.first_value.covers?(position) }
                    .try &.first_key

  candidate unless (candidate =~ /\A(?:\p{P}|\p{Z})+\Z/)
end

p get_word_of("Dear people:", 9)                       # => people
p get_word_of("My name is [Ángeliño](#angelino).", 20) # => Ángeliño
p get_word_of("Bye!", 3)                               # => Bye
0 голосов
/ 07 мая 2018

Удобный способ получить числовую позицию секции строки - использовать регулярное выражение, например:

filename = "/path/to/file"
File.each_line(filename).each_with_index do |line, line_number|
  term = "search-term"
  column = line =~ %r{#{term}}
  p "Found #{term} at line #{line_number}, column #{column}." if column
end

Выходы: "Found search-term at line 38, column 6"

...