Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,从字符串中解析出该值的最佳方法是什么?_C#_String_Parsing - Fatal编程技术网

在C#中,从字符串中解析出该值的最佳方法是什么?

在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

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


有人能推荐一种更优雅、更适合未来的方法来解析系统名吗?

您可以使用正则表达式来解析它。可能有更好的表达方式,但这一种适用于您的情况:

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,所以我问的是为了能理解这样更好。