代码之家  ›  专栏  ›  技术社区  ›  dimus

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

  •  0
  • dimus  · 技术社区  · 16 年前

    我想知道,在我将ruby analagous中的字符串拆分为PHP preg_split时,是否有一种方法可以获得偏移量和分隔符:

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

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

    3 回复  |  直到 16 年前
        1
  •  3
  •   molf    16 年前

    你在找 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
    
        2
  •  1
  •   pts    16 年前

    您可以从 $~ 例如,在Ruby中:

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

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

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

        3
  •  0
  •   dimus    16 年前

    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
    
    推荐文章