如何优化<ex=1>与test匹配校验逻辑并全面捕获输入错误?
优化
<ex=1>与test关联的正确性统计逻辑 嘿,我来帮你梳理下这个问题的优化思路~你的核心需求是统计<ex=1>标签在test单词之前的合法关联次数,同时识别所有无效输入的错误类型,对吧?先理清楚当前实现的问题,再给出更可靠的方案。
需求回顾
- 合法关联:必须是
<ex=1>标签出现在test单词之前(允许两者之间有其他内容) - 输入示例:
m = "<ex=1>test xxxx <ex=1>test xxxxx test <ex=1>" - 要求:统计正确关联数,同时输出明确的错误提示(比如多余的标签、多余的单词、顺序错误的情况)
当前实现的疏漏
你当前的代码只匹配了连续的<ex=1>test字符串,这会带来几个问题:
- 忽略了标签和单词之间有其他内容的合法情况(比如
<ex=1> 这里有内容 test其实是有效的关联,但你的代码不会统计) - 无法检测
test在<ex=1>之前的非法关联(比如test <ex=1>这种错误场景,你的代码只会把它算成一个单独的test,无法识别是顺序错误) - 错误提示不够精准,无法区分“标签没配对”、“单词没配对”、“顺序错误”这些不同问题
优化后的实现方案
我们可以用双指针遍历位置索引的方式,精准匹配合法关联,同时识别所有错误类型:
m = "<ex=1>test xxxx <ex=1>test xxxxx test <ex=1>" # 提取所有<ex=1>标签的起始位置 ex_positions = m.enum_for(:scan, /<ex=1>/).map { Regexp.last_match.begin(0) } # 提取所有test单词的起始位置 test_positions = m.enum_for(:scan, /test/).map { Regexp.last_match.begin(0) } correct_matches = 0 ex_idx = 0 test_idx = 0 # 双指针按顺序配对合法关联 while ex_idx < ex_positions.size && test_idx < test_positions.size if ex_positions[ex_idx] < test_positions[test_idx] # 标签在单词前面,配对成功 correct_matches += 1 ex_idx += 1 test_idx += 1 else # 单词在标签前面,属于非法关联,跳过这个单词 test_idx += 1 end end # 收集错误信息 errors = [] if ex_idx < ex_positions.size errors << "存在 #{ex_positions.size - ex_idx} 个未匹配的<ex=1>标签(缺少对应的test)" end if test_idx < test_positions.size errors << "存在 #{test_positions.size - test_idx} 个未匹配的test单词(要么出现在<ex=1>标签之前,要么没有对应的标签)" end # 输出结果 if errors.empty? puts "输入有效,正确关联次数:#{correct_matches}" else puts "输入无效,错误信息:" errors.each { |err| puts "- #{err}" } end
优化点详解
- 位置匹配逻辑:不再依赖连续字符串匹配,而是通过比较标签和单词的起始位置,确保标签在单词之前才算合法,支持两者之间有任意内容
- 双指针遍历:按顺序逐个配对,跳过所有顺序错误的单词,能准确统计出真正合法的关联次数
- 精准错误提示:区分“未匹配的标签”和“未匹配的单词(含顺序错误)”两种情况,让用户清楚知道问题出在哪里
用你的示例输入运行这段代码,会输出:
输入无效,错误信息: - 存在 1 个未匹配的<ex=1>标签(缺少对应的test) - 存在 1 个未匹配的test单词(要么出现在<ex=1>标签之前,要么没有对应的标签)
这完全符合示例的实际情况:3个标签、3个单词,其中2个正确关联,剩下1个标签没有对应test,1个test没有在标签之后。
内容的提问来源于stack exchange,提问作者Ruby Learner
相关产品推荐
相关产品推荐

