我有以下示例字符串
"CTS3010 - 6ppl"
或者
"CTs3200 - 14ppl"
或者
"CTS-500 2ppl"
我需要从这些字符串中解析出数字。解析字符串末尾“ppl”之前的数字的最佳方法是什么。我需要正则表达式吗?我有逻辑向后循环,但感觉这里有一个更优雅的解决方案。
这些只是示例,但所有示例似乎都遵循相同的模式
- 一堆文字
- 一个号码
- ppl 后缀
您可以这样做以获取“ppl”之前的号码:
using System.Text.RegularExpressions;
...
Regex regex = new Regex("([0-9]+)ppl");
string matchedValue = regex.Match("CTS-500 122ppl").Groups[1].Value;
在这种情况下matchedValue
将是 122。
如果您想要安全,并且您知道“ppl”将始终位于字符串的末尾,我会将正则表达式更改为:("([0-9]+)ppl$"
唯一的区别是末尾的美元符号)。
这是使用 LINQ 的一种方法:
const String ppl = "ppl";
var examples = new[] { "CTS3010 - 6ppl", "CTs3200 - 14ppl", "CTS-500 2ppl" };
var delimiters = new[] { " " };
var result = examples
.Select(e => e.Split(delimiters, StringSplitOptions.RemoveEmptyEntries))
.Select(t => t.Last().ToLowerInvariant().Replace(ppl, String.Empty))
.Select(Int32.Parse)
.ToList();
请注意,如果它无法解析整数值,这将失败。如果您不能保证每个字符串都以结尾,NNppl
则需要先检查它是否为数值。
我不知道“最佳方式”,但一种非常容易理解和修改的方法是字符串对象的扩展方法:
public static int Parse(this string phrase)
{
if (string.IsNullOrWhiteSpace(phrase)) { throw new NullReferenceException("phrase is null");}
string num = string.Empty;
foreach (char c in phrase.Trim().ToCharArray()) {
if (char.IsWhiteSpace(c)) { break; }
if (char.IsDigit(c)) { num += c.ToString(); }
}
return int.Parse(num);
}
假设“”是中断条件。如果您有可能没有获得数字和/或 System.Text.StringBuilder,您可能更喜欢 int.TryParse。