如何验证C#中长字符串包含短字符串的所有字母字符?
嘿,这个需求其实很好解决,我给你分享两种实用的方案,你可以根据自己的编码习惯来选:
方案一:用集合操作(直观易懂,推荐新手)
这个思路核心就是先把两个字符串里的有效字母(过滤掉非字母字符,比如.)提取出来,统一大小写避免区分,再用集合快速检查所有短字符串的字母是否都在长字符串里。
代码示例(C#):
string longName = "PRODUCT MANAGER OFFICE"; string shortName = "P.M.O"; // 提取长字符串的所有字母,转成大写后存入HashSet(查找效率极高) var longLetterSet = new HashSet<char>(longName.Where(char.IsLetter).Select(char.ToUpper)); // 提取短字符串的所有字母,同样转成大写 var shortLetters = shortName.Where(char.IsLetter).Select(char.ToUpper); // 检查短字符串的每一个字母是否都存在于长字符串的集合中 bool allMatch = shortLetters.All(letter => longLetterSet.Contains(letter)); Console.WriteLine(allMatch); // 输出 True
这个方法的优势是逻辑清晰,哪怕是刚入门的开发者也能看懂,而且HashSet的Contains方法是O(1)时间复杂度,处理长字符串也不会有性能问题。
方案二:正则表达式(代码简洁,适合熟悉正则的同学)
如果你对正则表达式比较熟悉,可以用正向预查的特性来实现:先提取短字符串里的所有字母,然后生成一个要求所有字母都存在的正则模式,再匹配长字符串(忽略大小写)。
代码示例(C#):
string longName = "PRODUCT MANAGER OFFICE"; string shortName = "pmoff"; // 提取短字符串中的所有字母,去重(避免重复检查同一个字符) var uniqueShortLetters = shortName.Where(char.IsLetter).Distinct(); // 生成正则模式:每个字母对应一个正向预查,确保该字母存在 string regexPattern = string.Join("", uniqueShortLetters.Select(c => $"(?=.*{Regex.Escape(c.ToString())})")); // 创建正则实例,开启忽略大小写选项 Regex checkRegex = new Regex(regexPattern, RegexOptions.IgnoreCase); // 检查长字符串是否满足所有字母存在的条件 bool allMatch = checkRegex.IsMatch(longName); Console.WriteLine(allMatch); // 输出 True,因为P、M、O、F都在长字符串里
这里的(?=.*X)是正向预查,意思是“字符串中至少包含一个X”,把所有字母的预查拼接起来,就要求所有字母都必须存在于长字符串中。
两种方案的对比
- 集合操作:逻辑直白,容易维护,适合大多数场景,尤其是团队里有新手的情况。
- 正则表达式:代码更紧凑,但需要理解正向预查的逻辑,适合对正则熟悉的开发者。
另外要注意边界情况:如果短字符串里没有任何字母(比如"..."),两种方案都会返回True,因为没有需要验证的字符;如果短字符串里有长字符串没有的字母(比如"PMOX"),则会返回False。
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

