longest match
最長最左マッチ。
require 'strscan'
def longest_match(scanner, res)
sz = 0
regexp = nil
res.each {|re|
x = scanner.match?(re)
if (x ||= 0) > sz
regexp = re
sz = x
end
}
yield(regexp, regexp ? scanner.scan(regexp) : nil)
end
longest_match(StringScanner.new("iffff"), [/if/, /[a-z]+/]) {|re,tkn| tkn } => "iffff"
longest_match(StringScanner.new("if"), [/if/, /[a-z]+/]) {|re,tkn| tkn } => "if"
longest_match(StringScanner.new("12345"), [/if/, /[a-z]+/]) {|re,tkn| tkn } => nilどうしようもない系だけど、Rubyの組み込み正規表現を活用するとこんな感じだろうか。遅かったら、Cで書き直す。つーか覚悟を決めてflex使う。
※バグってたので修正