簡體   English   中英

如何從StringScanner捕獲項目?

[英]How do I capture items from StringScanner?

我正在使用Ruby的StringScanner來規范化一些英文文本。

def normalize text
  s = ''
  ss = StringScanner.new text
  while ! ss.eos? do
    s += ' ' if ss.scan(/\s+/)             # mutiple whitespace => single space
    s += 'mice' if ss.scan(/\bmouses\b/)   # mouses => mice
    s += '' if ss.scan(/\bthe\b/)          # remove 'the'
    s += "#$1 #$2" if ss.scan(/(\d)(\w+)/) # should split 3blind => 3 blind
  end
  s
end

normalize("3blind the   mouses")  #=> should return "3 blind mice"

相反,我只是得到" mice"

StringScanner#scan不捕獲(\\d)(\\w+)

要訪問捕獲的StringScanner(在Ruby 1.9及更高版本中),請使用StringScanner#[]

  s += "#{ss[1]} #{ss[2]}" if ss.scan(/(\d)(\w+)/) # splits 3blind => 3 blind

在Ruby 2.1中,你應該能夠按名稱捕獲(參見Peter Alfvin的鏈接

  s += "#{ss[:num]} #{ss[:word]}" if ss.scan(/(?<num>\d)(?<word>\w+)/)

注意:根據評論主題,這個/我的答案的第一個版本是完全偏離基礎的。 道歉。

根據http://ruby-doc.org/stdlib-1.9.2/libdoc/strscan/rdoc/StringScanner.html的實驗和評論,看起來StringScanner沒有設置匹配變量$1$2等,所以最后一個s += ...語句只是向s附加一個空格。

看看strscan.c似乎確實沒有提供捕獲的匹配信息的支持,但我確實找到了https://www.ruby-forum.com/topic/4413436 ,這似乎是一些正在進行中的努力排序實現這一點

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM