未知长度字符串中如何验证倒数第三个字符为指定值?
问题翻译与需求说明
我需要处理格式为123*7?8的字符串:
*代表长度不超过3位的任意数字或空值?代表任意数字
现在要验证字符串的倒数第三个字符为'7',同时满足开头是123、结尾是8,且对应的数字能被23整除。以下是我写的代码,但不知道怎么实现倒数第三个字符的验证:
for (int i = 1000000; i < 1000000000; i++) { string s = Convert.ToString(i); // How can I check that 3rd character from the end is '7'? if (s[0] == '1' && s[1] == '2' && s[2] == '3' && s.Last() == '8') { if (i % 23 == 0) { Console.WriteLine(s); } } }
解决方法
要判断字符串倒数第三个字符为'7',可以用两种方式实现:
1. 兼容所有C#版本的写法
通过字符串长度计算索引:s[s.Length - 3] == '7'。同时先判断字符串长度至少为6(符合格式的最短字符串是123708,共6位),避免索引越界。
修改后的代码:
for (int i = 123000; i < 1000000000; i++) // 调整起点覆盖6位有效数字 { string s = Convert.ToString(i); // 先判断长度符合要求,再检查各条件 if (s.Length >= 6 && s[0] == '1' && s[1] == '2' && s[2] == '3' && s[s.Length - 3] == '7' // 核心:倒数第三个字符为'7' && s.Last() == '8') { if (i % 23 == 0) { Console.WriteLine(s); } } }
2. C# 8.0及以上版本的简化写法
使用C# 8.0引入的索引运算符^,^3直接代表倒数第三个元素的索引,代码更直观:
for (int i = 123000; i < 1000000000; i++) { string s = Convert.ToString(i); if (s.Length >= 6 && s[0] == '1' && s[1] == '2' && s[2] == '3' && s[^3] == '7' // 倒数第三个字符 && s[^1] == '8') // 用^1代替Last(),语义更统一 { if (i % 23 == 0) { Console.WriteLine(s); } } }
额外优化说明
- 原循环起点
1000000会漏掉6位的有效数字(比如123708),调整为123000后可覆盖所有可能的有效长度(6-9位)。 - 先判断字符串长度
>=6,可以避免后续索引访问时出现IndexOutOfRangeException。
内容的提问来源于stack exchange,提问作者Makar
相关产品推荐
相关产品推荐

