实现接收消息与索引、提取对应星号前缀标记的C#方法
实现方案
你现有代码的问题:
- 错误使用
@作为标记前缀,需求要求前缀为*- 硬编码取第一个前缀位置和最后一个空格位置,无法适配多标记、标记后紧跟标点等场景
- 未实现按索引匹配标记的逻辑,也没有按合法字符范围截断的判断
实现逻辑
- 首先校验输入合法性:索引小于1、输入消息为空时直接返回空字符串(可根据业务需求调整为抛出参数异常)
- 遍历消息字符串,按顺序匹配所有以
*开头的标记:- 匹配到
*字符后,从该位置开始向后遍历,直到遇到非字母、数字、下划线、连字符的字符为止,截取该区间作为完整标记 - 每匹配到一个合法标记就计数+1,计数与传入索引相等时直接返回该标记
- 匹配到
- 遍历完全部字符串仍未找到对应索引的标记时返回空
完整代码
public string GetIndexedNames(string message, int index) { // 入参合法性校验 if (string.IsNullOrWhiteSpace(message) || index < 1) return string.Empty; int matchCount = 0; int cursor = 0; while (cursor < message.Length) { // 匹配*开头的标记起始位置 if (message[cursor] == '*') { int tagStart = cursor; cursor++; // 向后遍历直到遇到非法字符停止 while (cursor < message.Length && (char.IsLetterOrDigit(message[cursor]) || message[cursor] == '_' || message[cursor] == '-')) { cursor++; } matchCount++; // 匹配到对应索引直接返回标记 if (matchCount == index) { return message.Substring(tagStart, cursor - tagStart); } } else { cursor++; } } // 未找到对应索引的标记 return string.Empty; }
效果验证
你提供的示例入参GetIndexedNames("Hello, I am *Name1, how are you doing *Name2?", 2)运行后,返回结果为*Name2,完全符合需求。
如果需要对不存在的索引抛出异常,可将最后返回空的逻辑替换为throw new ArgumentOutOfRangeException(nameof(index), "未找到对应索引的标记")。
内容的提问来源于stack exchange,提问作者aTubOfAdam
相关产品推荐
相关产品推荐

