You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现接收消息与索引、提取对应星号前缀标记的C#方法

实现方案

你现有代码的问题:

  1. 错误使用@作为标记前缀,需求要求前缀为*
  2. 硬编码取第一个前缀位置和最后一个空格位置,无法适配多标记、标记后紧跟标点等场景
  3. 未实现按索引匹配标记的逻辑,也没有按合法字符范围截断的判断

实现逻辑

  • 首先校验输入合法性:索引小于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:36:08