我正在尝试计算用户的正确输入。输入看起来像:
m = "<ex=1>test xxxx <ex=1>test xxxxx test <ex=1>"
标记ex=1
和单词test
必须连接,并按此特定顺序计算为正确。如果输入无效,我想向用户发送一条解释错误的错误消息。
我尝试按以下方式执行:
ex_test_size = m.scan(/<ex=1>test/).size # => 2
test_size = m.scan(/test/).size # => 3
ex_size = m.scan(/<ex=1>/).size # => 3
puts "lack of tags(<ex=1>)" if ex_test_size < ex_size
puts "Lack of the word(test)" if ex_test_size < test_size
我相信它可以用更好的方式编写,因为我的编写方式,我想,容易出错。如何确保找到所有错误并向用户显示?
答案 0 :(得分:1)
您可以使用negative lookarounds:
#⇒ ["xxx test", "<ex=1>"]
m.scan(/<ex=1>(?!test).{,4}|.{,4}(?<!<ex=1>)test/).map do |msg|
"<ex=1>test expected, #{msg} got"
end.join(', ')
我们扫描字符串以查找<ex=1>
,而不是test
,反之亦然。此外,我们最多可以抓取4个违反更具描述性信息规则的字符。