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

C# 如何简洁提取字符串中字符P之后的数值

解决方案

方案1:使用正则表达式(最简洁)

这个场景属于典型的固定模式匹配场景,用正则表达式可以省去大量边界条件判断,直接提取目标数值。

匹配规则:我们需要匹配字符P后紧跟的可选负号 + 整数数字序列,正则模式为@"P(-?\d+)",代码实现如下:

using System.Text.RegularExpressions;

// 输入字符串line
string line = "G66I215.4J270.P-55.Q-6.T2531(+K2H1+)";
int number = 0;

Match match = Regex.Match(line, @"P(-?\d+)");
if (match.Success)
{
    number = int.Parse(match.Groups[1].Value);
}

说明:

  • 正则里的-?匹配可选的负号,自动适配正负数场景
  • \d+匹配1个及以上的数字
  • 括号()为捕获组,Groups[1]可以直接拿到P后面的数值部分,无需手动判断后面跟的是C、Q还是其他任意分隔字符
  • 针对你给出的三个示例输入,该代码会分别返回5、-5、-55,完全符合需求

方案2:非正则手动实现(适用于禁用正则的场景)

如果你的开发场景不允许使用正则,也可以优化原IndexOf逻辑,无需逐个判断后续字符类型:

string line = "G66I11.J270.P5.C90.(+K2H1+)";
int indexP = line.IndexOf('P');
int number = 0;
if (indexP >= 0 && indexP < line.Length - 1)
{
    int start = indexP + 1;
    int end = start;
    // 第一个字符如果是负号,向后移动一位
    if (line[start] == '-')
    {
        end++;
    }
    // 连续读取数字直到遇到非数字字符停止
    while (end < line.Length && char.IsDigit(line[end]))
    {
        end++;
    }
    number = int.Parse(line.Substring(start, end - start));
}

内容的提问来源于stack exchange,提问作者dev.for.live

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:24:03