2009-12-28 34 views
9

Ví dụ, tôi muốn tách:Làm thế nào để tách nhân vật và một phần số từ chuỗi

  • OS234 để OS234
  • AA4230-AA4230

Tôi đã sử dụng sau tầm thường giải pháp, nhưng tôi khá chắc chắn rằng cần có một giải pháp hiệu quả và mạnh mẽ hơn.

private void demo() 
    { string cell="ABCD4321"; 
     int a = getIndexofNumber(cell); 
     string Numberpart = cell.Substring(a, cell.Length - a); 
     row = Convert.ToInt32(rowpart); 
     string Stringpart = cell.Substring(0, a); 
    } 

private int getIndexofNumber(string cell) 
     { 
      int a = -1, indexofNum = 10000; 
      a = cell.IndexOf("0"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("1"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("2"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("3"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("4"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("5"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("6"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("7"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("8"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 
      a = cell.IndexOf("9"); if (a > -1) { if (indexofNum > a) { indexofNum = a; } } 

      if (indexofNum != 10000) 
      { return indexofNum; } 
      else 
      { return 0; } 


     } 

Trả lời

1

Tôi đã sử dụng câu trả lời bniwredyc của để có được Phiên bản cải tiến của thói quen của tôi:

private void demo() 
     { 
      string cell = "ABCD4321"; 
      int row, a = getIndexofNumber(cell); 
      string Numberpart = cell.Substring(a, cell.Length - a); 
      row = Convert.ToInt32(Numberpart); 
      string Stringpart = cell.Substring(0, a); 
     } 

     private int getIndexofNumber(string cell) 
     { 
      int indexofNum=-1; 
      foreach (char c in cell) 
      { 
       indexofNum++; 
       if (Char.IsDigit(c)) 
       { 
        return indexofNum; 
       } 
      } 
      return indexofNum; 
     } 
5

Sử dụng LINQ để làm điều này

string str = "OS234"; 

var digits = from c in str 
      select c 
      where Char.IsDigit(c); 

var alphas = from c in str 
      select c 
      where !Char.IsDigit(c); 
+0

+1 giải pháp sạch –

+2

này có vẻ là giải pháp tốt, nhưng tiếc là .net 2.0 người dùng không thể sử dụng LINQ – Thunder

+0

Tôi khuyên bạn nên - nâng cấp lên C# 3.0. –

15

Regular Expressions là phù hợp nhất cho các loại hình công việc:

using System.Text.RegularExpressions; 

Regex re = new Regex(@"([a-zA-Z]+)(\d+)"); 
Match result = re.Match(input); 

string alphaPart = result.Groups[1].Value; 
string numberPart = result.Groups[2].Value; 
+1

Có thể muốn thêm hai dòng vào câu trả lời này: chuỗi alphaPart = result.Groups [1]; chuỗi numberPart = result.Groups [2]; –

+0

Sau đây có vẻ là giải pháp hoàn chỉnh hơn: Regex re = new Regex (@ "([a-zA-Z] +) (\ d +)"); Kết quả trận đấu = re.Match ("as23"); chuỗi alphaPart = result.Groups [1] .ToString(); chuỗi numberPart = result.Groups [2] .ToString(); – Thunder

+1

Không phải là 'result.Groups [1] .Value'? –

3

Mọi người và mẹ của họ sẽ cung cấp cho bạn một giải pháp sử dụng regex, vì vậy đây là một trong số đó không phải là:

// s is string of form ([A-Za-z])*([0-9])* ; char added 
int index = s.IndexOfAny(new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }); 
string chars = s.Substring(0, index); 
int num = Int32.Parse(s.Substring(index)); 
1

Bạn đang làm điều này cho mục đích phân loại? Nếu vậy, hãy nhớ rằng Regex có thể giết hiệu suất cho các danh sách lớn. Tôi thường sử dụng AlphanumComparer đó là giải pháp chung cho vấn đề này (có thể xử lý bất kỳ chuỗi chữ cái và số nào theo thứ tự bất kỳ). Tôi tin rằng tôi đã điều chỉnh nó từ this page.

Thậm chí nếu bạn không phân loại, sử dụng cách tiếp cận từng ký tự (nếu bạn có độ dài thay đổi) hoặc chuỗi con/phân tích đơn giản (nếu chúng cố định) sẽ hiệu quả hơn và dễ dàng hơn thử nghiệm hơn Regex.

1

.NET 2.0 tương thích, mà không regex

public class Result 
{ 
    private string _StringPart; 
    public string StringPart 
    { 
     get { return _StringPart; } 
    } 

    private int _IntPart; 
    public int IntPart 
    { 
     get { return _IntPart; } 
    } 

    public Result(string stringPart, int intPart) 
    { 
     _StringPart = stringPart; 
     _IntPart = intPart; 
    } 
} 

class Program 
{ 
    public static Result GetResult(string source) 
    { 
     string stringPart = String.Empty; 
     int intPart; 
     var buffer = new StringBuilder(); 
     foreach (char c in source) 
     { 
      if (Char.IsDigit(c)) 
      { 
       if (stringPart == String.Empty) 
       { 
        stringPart = buffer.ToString(); 
        buffer.Remove(0, buffer.Length); 
       } 
      } 

      buffer.Append(c); 
     } 

     if (!int.TryParse(buffer.ToString(), out intPart)) 
     { 
      return null; 
     } 

     return new Result(stringPart, intPart); 
    } 

    static void Main(string[] args) 
    { 
     Result result = GetResult("OS234"); 
     Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart); 
     result = GetResult("AA4230 "); 
     Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart); 
     result = GetResult("ABCD4321"); 
     Console.WriteLine("String part: {0} int part: {1}", result.StringPart, result.IntPart); 
     Console.ReadKey(); 
    } 
} 
+0

Trông khá thiết kế! –

+0

@this .__ curious_geek yep. Tôi thích giải pháp Jasons. – bniwredyc

-1

sử dụng Split tới chuỗi seprate từ chích rằng việc sử dụng tab \ t và không gian

string s = "sometext\tsometext\tsometext"; 
string[] split = s.Split('\t'); 

bây giờ bạn có một chuỗi chuỗi mà bạn muốn quá dễ dàng

0

Nếu bạn muốn giải quyết nhiều lần xuất hiện của char tiếp theo số hoặc ngược lại bạn có thể sử dụng

private string SplitCharsAndNums(string text) 
{ 
    var sb = new StringBuilder(); 
    for (var i = 0; i < text.Length - 1; i++) 
    { 
     if ((char.IsLetter(text[i]) && char.IsDigit(text[i+1])) || 
      (char.IsDigit(text[i]) && char.IsLetter(text[i+1]))) 
     { 
      sb.Append(text[i]); 
      sb.Append(" "); 
     } 
     else 
     { 
      sb.Append(text[i]); 
     } 
    } 

    sb.Append(text[text.Length-1]); 

    return sb.ToString(); 
} 

Và sau đó

var text = SplitCharsAndNums("asd1 asas4gr5 6ssfd"); 
var tokens = text.Split(' '); 
0

Tôi thực sự thích jason's answer. Chúng tôi không cần regex ở đây. Giải pháp của tôi để xử lý dữ liệu nhập như "H1N1":

public static IEnumerable<string> SplitAlpha(string input) 
{ 
    var words = new List<string> { string.Empty }; 
    for (var i = 0; i < input.Length; i++) 
    { 
     words[words.Count-1] += input[i]; 
     if (i + 1 < input.Length && char.IsLetter(input[i]) != char.IsLetter(input[i + 1])) 
     { 
      words.Add(string.Empty); 
     } 
    } 
    return words; 
} 

Giải pháp này là tuyến tính (O (n)).

ouput

"H1N1" -> ["H", "1", "N", "1"] 
"H" -> ["H"] 
"GH1N12" -> ["GH", "1", "N", "12"] 
"OS234" -> ["OS", "234"] 
Các vấn đề liên quan