String.Contains()无法匹配循环生成的拼接字符串列表项问题
解决String.Contains()找不到预期前缀匹配的问题
嘿,我懂你遇到的糟心事——明明目标字符串里明摆着有那个前缀,String.Contains()却死活找不到,属实让人挠头。咱们一步步拆解问题,搞定它:
先排查前缀数组的生成逻辑
最容易出问题的地方,就是拼接前缀时的空格处理或者拆分原字符串时的标点干扰:
- 如果初始化第一个前缀时不小心加了前导空格(比如直接用
current += " " + word),那第一个前缀会变成" The",而目标字符串开头是"The",自然匹配不上,后面的长前缀也会跟着出错。 - 如果拆分原字符串时没处理标点(比如把
"sun."当成完整单词),虽然不影响你要找的"The Earth is the",但可能导致后续前缀带标点,干扰其他匹配。
给你一个正确生成前缀数组的示例(以C#为例):
// 原字符串1 string sourceStr = "The Earth is the third planet from the sun."; // 拆分单词:过滤掉标点和空项,只保留纯单词 var words = sourceStr.Split(new[] { ' ', '.', '!' }, StringSplitOptions.RemoveEmptyEntries); var prefixList = new List<string>(); string currentPrefix = ""; foreach (var word in words) { // 处理第一个单词,避免前导空格 currentPrefix = string.IsNullOrEmpty(currentPrefix) ? word : $"{currentPrefix} {word}"; prefixList.Add(currentPrefix); }
这样生成的prefixList会是完全符合你需求的逐步拼接结果:
"The""The Earth""The Earth is""The Earth is the""The Earth is the third"- ...(后续更长的前缀)
再检查String.Contains()的调用细节
如果前缀数组是对的,但还是匹配失败,大概率是这两个原因:
- 大小写敏感:默认的
Contains()是区分大小写的,如果目标字符串里有大小写不一致的情况(比如某个单词小写了),可以用忽略大小写的重载:
str2.Contains(prefix, StringComparison.OrdinalIgnoreCase)
- 隐藏的空格/字符差异:比如原字符串里有全角空格,或者拼接时不小心多打了空格,导致前缀里的空格和目标字符串的空格不匹配。可以打印每个前缀的长度,和目标字符串对应部分的长度对比,就能快速发现问题。
最后优化匹配逻辑(找最长匹配)
如果你要找的是最长的有效匹配前缀,其实不用遍历所有元素——因为前缀是逐步变长的,一旦某个前缀不匹配,后面更长的肯定也不匹配,可以提前终止循环提升效率:
string targetStr = "The Earth is the planet we live on."; string longestMatch = ""; foreach (var prefix in prefixList) { if (targetStr.Contains(prefix)) { longestMatch = prefix; } else { // 更长的前缀包含当前前缀,当前不匹配的话后面不用再看了 break; } } // 输出结果就是你要的"The Earth is the" Console.WriteLine(longestMatch);
按照这个流程检查下来,应该就能顺利找到你要的匹配项啦!
内容的提问来源于stack exchange,提问作者Matt McManis
相关产品推荐
相关产品推荐

