6

我必须从更大的字符串中解析出系统名称。系统名称的前缀是“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 之前有一堆其他文本。

任何人都可以在这里提出一种更优雅且面向未来的解析系统名称的方法吗?

4

4 回答 4

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

演示

于 2013-05-20T13:59:03.840 回答
2

您真的可以利用正则表达式并获得更好的结果。这个应该可以解决问题[A-Za-z]{3}\d+,这里有一个Rubular 来证明这一点。然后在代码中像这样使用它:

var matches = Regex.Match(someInputString, @"[A-Za-z]{3}\d+");
if (matches.Success) {
    var val = matches.Value;
}
于 2013-05-20T14:00:14.847 回答
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");
      }
    }
  }
}
于 2013-05-20T13:58:41.170 回答
1

你绝对应该使用Regex它。根据系统名称的确切性质,这样的事情可能就足够了:

Regex systemNameRegex = new Regex(@"ABC[0-9]+");

如果名称的ABC部分可以更改,您可以将其修改Regex为如下所示:

Regex systemNameRegex = new Regex(@"[a-zA-Z]+[0-9]+");

于 2013-05-20T13:59:14.420 回答