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

如何在C#中使用Superpower正确解析符合规则的完整字符串

解决Superpower解析字符串时遇到无效字符不失败的问题

你的问题出在Many()的行为上:它会匹配零个或多个符合条件的字符,遇到第一个不匹配的字符就停止解析并返回已匹配的部分,而不会触发失败。要实现"遇到无效字符直接失败"的需求,你需要确保整个输入都被有效字符覆盖,即解析完名称后必须到达输入的结束位置。

修改后的代码

// 定义符合规则的有效字符:0x20-0x7e范围内,且不在禁止字符列表中
private static TextParser<char> ValidNameChar { get; } =
    Character.ExceptIn('{', '}', '[', ']', ',', ';', ':', '(', ')')
        .Where(c => c >= 0x20 && c <= 0x7e);

public static TextParser<string> Name { get; } =
    from firstChar in Character.Letter
    from restChars in ValidNameChar.Many()
    from end in Parser.End // 强制要求解析到输入结束,不允许剩余无效字符
    select new string(new[] { firstChar }.Concat(restChars).ToArray());

关键修改说明

  1. 提取通用有效字符解析器:把字符的范围检查和禁止字符排除逻辑封装成ValidNameChar,让代码更清晰。
  2. 添加Parser.End匹配:这是核心修改,它要求解析器必须完全消耗掉所有输入内容。如果输入中存在无效字符,解析到该字符时ValidNameChar无法匹配,后续的Parser.End也无法匹配剩余输入,整个解析过程就会直接失败,而不是截断返回已匹配部分。

测试验证

  • 输入"LC4711":解析器匹配完所有字符后成功到达输入结束,返回完整字符串。
  • 输入"L{C4711":匹配完L后遇到{,ValidNameChar不匹配,Parser.End也无法匹配剩余输入,解析直接失败。

内容的提问来源于stack exchange,提问作者whaeussler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:46:11