在C#中,从字符串中解析出该值的最佳方法是什么?
我必须从一个较大的字符串中解析出系统名。系统名称的前缀是“ABC”,然后是一个数字。例如:在C#中,从字符串中解析出该值的最佳方法是什么?,c#,string,parsing,C#,String,Parsing,我必须从一个较大的字符串中解析出系统名。系统名称的前缀是“ABC”,然后是一个数字。例如: ABC500 ABC1100 ABC1300 我需要从中解析系统名称的完整字符串可以类似于以下任何项目: ABC1100 - 2ppl ABC1300 ABC 1300 ABC-1300 Managers Associates Only (ABC1100 - 2ppl) 在我看到最后一个之前,我有一个非常好的代码: string[] trimmedStrings = jobTitle.Split(ne
ABC500
ABC1100
ABC1300
我需要从中解析系统名称的完整字符串可以类似于以下任何项目:
ABC1100 - 2ppl
ABC1300
ABC 1300
ABC-1300
Managers Associates Only (ABC1100 - 2ppl)
在我看到最后一个之前,我有一个非常好的代码:
string[] trimmedStrings = jobTitle.Split(new char[] { '-', '–' },StringSplitOptions.RemoveEmptyEntries)
.Select(s => s.Trim())
.ToArray();
return trimmedStrings[0];
但在最后一个例子中,它失败了,因为在ABC之前还有一堆其他文本
有人能推荐一种更优雅、更适合未来的方法来解析系统名吗?您可以使用正则表达式来解析它。可能有更好的表达方式,但这一种适用于您的情况:
using System;
using System.Text.RegularExpressions;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string txt="ABC500";
string re1="((?:[a-z][a-z]+))";
string re2="(\\d+)"
Regex r = new Regex(re1+re2,RegexOptions.IgnoreCase|RegexOptions.Singleline);
Match m = r.Match(txt);
if (m.Success)
{
String word1=m.Groups[1].ToString();
String int1=m.Groups[2].ToString();
Console.Write("("+word1.ToString()+")"+"("+int1.ToString()+")"+"\n");
}
}
}
}
一种方法是:
string[] strings =
{
"ABC1100 - 2ppl",
"ABC1300",
"ABC 1300",
"ABC-1300",
"Managers Associates Only (ABC1100 - 2ppl)"
};
var reg = new Regex(@"ABC[\s,-]?[0-9]+");
var systemNames = strings.Select(line => reg.Match(line).Value);
systemNames.ToList().ForEach(Console.WriteLine);
印刷品:
ABC1100
ABC1300
ABC 1300
ABC-1300
ABC1100
对此,您绝对应该使用
Regex
。根据系统名称的确切性质,类似这样的内容就足够了:
Regex systemNameRegex=newregex(@“ABC[0-9]+”)代码>
如果名称的ABC部分可以更改,则可以将Regex
修改为如下内容:
var matches = Regex.Match(someInputString, @"[A-Za-z]{3}\d+");
if (matches.Success) {
var val = matches.Value;
}
Regex-systemNameRegex=newregex(@“[a-zA-Z]+[0-9]+”)代码>您确实可以利用正则表达式获得更好的结果。这一个应该完成这个技巧[A-Za-z]{3}\d+
,下面是一个例子。然后在代码中按如下方式使用:
var matches = Regex.Match(someInputString, @"[A-Za-z]{3}\d+");
if (matches.Success) {
var val = matches.Value;
}
IMHO,正则表达式是正确的方法。你应该形成一个正则表达式,它匹配以数字为后缀的字符正则表达式(?你可能想签出。与Shaaman的答案中使用的+
相反,*
有什么作用?另外,我认为他们不会在问题的任何地方只问数字部分。*
表示小数量(不含小数).+
表示需要一个或多个。@Ashburaczenko谢谢你的提醒。我真的认为是否需要*
或+
完全取决于域。ABC
是否应该提取?。@IlyaIvanov,我没有质疑你对*
的用法,我没有做Regex,所以我问的是为了能理解这样更好。