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
相关产品推荐
相关产品推荐

