Flutter/Dart循环字符串匹配异常:仅能匹配列表末尾元素
问题原因分析
核心问题是文本文件的换行符格式不统一:你用RegExp(r"\n")只匹配了LF(\n)换行,但实际文件里可能是CRLF(\r\n)格式的换行,导致除了最后一个单词外,其他分割出来的单词末尾都带有隐藏的\r字符。
比如"wall"分割后实际是"wall\r",控制台打印时会忽略\r,所以看起来是正常的"wall",但字符串比对时"wall\r" != "wall",自然匹配失败。而最后一个单词"zoo"后面没有换行符,分割后是纯净的"zoo",所以能正常匹配。
解决方案
有两种简单的修复方式:
1. 用兼容所有换行符的正则分割
把分割逻辑改成匹配任意换行格式:
splittedbipwords = bipwords.split(RegExp(r'\r?\n'));
\r?\n会同时匹配LF(\n)和CRLF(\r\n)两种换行,确保分割后的单词没有多余的控制字符。
2. 分割后对单词做trim处理
如果不确定文件里还有其他空白字符,可以给每个单词去除首尾空白:
splittedbipwords = bipwords.split(RegExp(r"\n")).map((word) => word.trim()).toList();
trim()会去掉字符串首尾的所有空白字符(包括\r、空格、制表符等),彻底避免隐藏字符导致的匹配问题。
验证小技巧
可以在打印时加上字符长度或转义内容,确认是否有隐藏字符:
print('$word (长度: ${word.length})'); // 或者打印转义后的字符串,查看隐藏字符 print(Uri.encodeComponent(word));
如果是"wall\r",Uri.encodeComponent会输出wall%0D,就能直观看到隐藏的\r了。
内容的提问来源于stack exchange,提问作者Tobias Welti
相关产品推荐
相关产品推荐

