如何在ruby中模拟PHP preg_split以捕获偏移量和分隔符?

时间:2010-04-24 21:58:12

标签: php ruby

我想知道是否有办法获得偏移量和分隔符,而我正在将一个字符串分解为ruby analagous到PHP preg_split:

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

我想我可以通过逐字符遍历字符串或使用像树顶一样重的东西来实现它,但我想使用更方便的东西。

3 个答案:

答案 0 :(得分:3)

您正在寻找可以MatchData#offset$~访问的MatchData#beginRegexp.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 :(得分:1)

您可以从Ruby中的$~获取偏移量,例如:

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

打印

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

基于此,您可以编写一个循环,生成与PHP代码相同的偏移量。

答案 2 :(得分:0)

感谢两种解决方案,非常有助于了解这种方法。如果我使用扫描,我必须添加逻辑以在匹配之间获取内容。使用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