Как эмулировать PHP preg_split в ruby ​​для захвата смещений и разделителей? - PullRequest
0 голосов
/ 25 апреля 2010

Интересно, есть ли способ получить смещения и разделители, пока я разбиваю строку в ruby, аналогичную PHP preg_split:

preg_split("/( |&nbsp;|<|>|\t|\n|\r|;|\.)/i", $html_string, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_OFFSET_CAPTURE);

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

Ответы [ 3 ]

3 голосов
/ 25 апреля 2010

Вы ищете MatchData#offset или MatchData#begin, к которым вы можете получить доступ по Regexp.last_match или $~:

html_string.scan(/( |&nbsp;|<|>|\t|\n|\r|;|\.)/i) do |match|
  # Returns begin and end position for this match, e.g. [5, 10]
  Regexp.last_match.offset(0)
end
1 голос
/ 25 апреля 2010

Вы можете получить смещения от $~ в Ruby, например:

"foobarbaz".scan(/[oa]+/) { p [$~.begin(0), $~.end(0), $~.to_s] }

печать

[1, 3, "oo"]
[4, 5, "a"]
[7, 8, "a"]

На основании этого вы можете написать цикл, который генерирует те же смещения, что и ваш PHP-код.

0 голосов
/ 25 апреля 2010

Спасибо за оба решения, очень полезно знать такой подход. Если я использую сканирование, я должен добавить логику, чтобы получить вещи между матчами. Тот же эффект может быть достигнут с аналогичным количеством строк, используя String # index. Жаль, что String # split не занимает блок

def html_split(str)
  DELIMITERS = /(&nbsp;|[\s<>;.])/i
  data = []
  offset = 0
  i = str.index(DELIMITERS)
  while i do
    if i > 0
      value = str[0...i]
      data << [value, offset] 
      offset += i
    end
    delimiter = str[i..i] == '&' ? str[i..i+6] : str[i..i]
    data << [delimiter, offset]
    offset += delimiter.size
    str = str[(i + delimiter.size)..-1]
    i = str.index(DELIMITERS)
  end
  data
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...