2013-05-20 11 views
6

Muszę sparsować nazwę systemu z większego łańcucha. Nazwa systemu ma przedrostek "ABC", a następnie numer. Oto kilka przykładów:W języku C#, jaki jest najlepszy sposób, aby przeanalizować tę wartość z ciąg znaków?

ABC500 
ABC1100 
ABC1300 

pełny ciąg, gdy trzeba analizować na nazwę systemu z może wyglądać którykolwiek z poniższych pozycji:

ABC1100 - 2ppl 
ABC1300 
ABC 1300 
ABC-1300 
Managers Associates Only (ABC1100 - 2ppl) 

przed Widziałem ostatni, miałem ten kod, który działał całkiem dobrze:

string[] trimmedStrings = jobTitle.Split(new char[] { '-', '–' },StringSplitOptions.RemoveEmptyEntries) 
          .Select(s => s.Trim()) 
          .ToArray(); 

return trimmedStrings[0]; 

, ale kończy się niepowodzeniem na ostatnim przykładzie, gdy przed ABC znajduje się wiązka innego tekstu.

Czy ktoś może zaproponować bardziej elegancki i przyszłościowy sposób analizowania nazwy systemu?

+8

IMHO, Regex jest właściwą drogą. powinieneś utworzyć wyrażenie regularne, które będzie pasowało do znaków z przyrostkiem numerycznym – Saravanan

+1

RegEx '(? <= ABC) [0-9] +' powinno Cię doprowadzić bezpośrednio do części numerycznej. – dash

+0

Możesz chcieć sprawdzić [A sscanf() Zamiennik dla .NET] (http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-fornet). –

Odpowiedz

7

Jednym ze sposobów, aby to zrobić:

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); 

wydruki:

ABC1100 
ABC1300 
ABC 1300 
ABC-1300 
ABC1100 

demo

+0

Co robi '*'? W przeciwieństwie do '+ 'użytego w odpowiedzi Shaamaana. –

+0

Plus, nie sądzę, że pytają nigdzie w pytaniu tylko o część liczbową. –

+0

'*' oznacza dowolną liczbę miejsc po przecinku (w tym w ogóle miejsca dziesiętne). '+' oznacza, że ​​wymagany jest jeden lub więcej. – Shaamaan

1

Możesz użyć wyrażenia regularnego do przeanalizowania tego. Nie może być lepsze wyrażeń, ale ten działa w Twoim przypadku:

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"); 
     } 
    } 
    } 
} 
1

Powinieneś zdecydowanie użyj do tego celu Regex. W zależności od dokładnego charakteru nazwy systemu, coś takiego może się okazać na tyle:

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

Jeśli ABC część nazwy można zmienić, można zmodyfikować Regex na coś takiego:

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

2

naprawdę mógłby wykorzystać regex i uzyskać lepsze wyniki. Ten powinien wykonać sztuczkę [A-Za-z]{3}\d+, a tutaj jest Rubular to prove it. Następnie użyj kodu w następujący sposób:

var matches = Regex.Match(someInputString, @"[A-Za-z]{3}\d+"); 
if (matches.Success) { 
    var val = matches.Value; 
} 
Powiązane problemy