[英]Ruby StringScanner used for lexing : how to get the line number?
[英]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.