我必须从更大的字符串中解析出系统名称。系统名称的前缀为“ABC”,然后是数字。一些例子是:
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之前有一堆其他文字的最后一个例子中失败了。
有人能建议在这里解析出系统名称的更优雅和面向未来的方法吗?
答案 0 :(得分:7)
一种方法:
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
答案 1 :(得分:2)
你真的可以利用正则表达式并获得更好的结果。这个应该做的是[A-Za-z]{3}\d+
,这里是Rubular to prove it。然后在代码中使用它:
var matches = Regex.Match(someInputString, @"[A-Za-z]{3}\d+");
if (matches.Success) {
var val = matches.Value;
}
答案 2 :(得分:1)
您可以使用正则表达式来解析它。可能有更好的表达方式,但这个适用于您的情况:
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");
}
}
}
}
答案 3 :(得分:1)
你绝对应该使用Regex
。根据系统名称的确切性质,这样的事情可以证明是足够的:
Regex systemNameRegex = new Regex(@"ABC[0-9]+");
如果名称的 ABC 部分可以更改,您可以将Regex
修改为以下内容:
Regex systemNameRegex = new Regex(@"[a-zA-Z]+[0-9]+");