2012-02-08 28 views
6

Tôi đang phát triển một ứng dụng bằng cách sử dụng C# .net trong đó tôi cần rằng nếu đầu vào được người dùng nhập có chứa ký tự '-' (dấu gạch nối) thì tôi muốn những người hàng xóm ngay lập tức dấu nối (-) được ghép nối ví dụ nếu người dùng nhậpNối các ký tự lân cận của một ký tự đặc biệt "-"

A-B-C then i want it to be replaced with ABC 
AB-CD then i want it to be replaced like BC 
ABC-D-E then i want it to be replaced like CDE 
AB-CD-K then i want it to be replaced like BC and DK both separated by keyword and 

sau khi nhận được điều này, tôi phải chuẩn bị truy vấn của mình vào cơ sở dữ liệu.

tôi hy vọng tôi đã giải quyết vấn đề rõ ràng nhưng nếu cần làm rõ thêm, hãy cho tôi biết. Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao.

Cảm ơn, Devjosh

+0

cụm từ thông dụng là câu trả lời ở đây ([AZ]) - ([AZ]) – Tom

+0

Tôi nên sử dụng nó như thế nào trong các hàm thao tác chuỗi C# bạn có thể xây dựng thêm @Tom – Devjosh

+0

Vì vậy, bạn muốn 'ABC-DE' để sản xuất? 'CD' và' DE'? Nó là khó hiểu – Aliostad

Trả lời

3

chưa được kiểm tra, nhưng điều này nên làm như lừa, hoặc ít nhất dẫn bạn trong đúng hướng.

private string Prepare(string input) 
{ 
    StringBuilder output = new StringBuilder(); 
    char[] chars = input.ToCharArray(); 
    for (int i = 0; i < chars.Length; i++) 
    { 
     if (chars[i] == '-') 
     { 
      if (i > 0) 
      { 
       output.Append(chars[i - 1]); 
      } 
      if (++i < chars.Length) 
      { 
       output.Append(chars[i]) 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
    return output.ToString(); 
} 

Nếu bạn muốn mỗi cặp để tạo thành một đối tượng riêng biệt trong một mảng, hãy thử đoạn mã sau:

private string[] Prepare(string input) 
{ 
    List<string> output = new List<string>(); 
    char[] chars = input.ToCharArray(); 
    for (int i = 0; i < chars.Length; i++) 
    { 
     if (chars[i] == '-') 
     { 
      string o = string.Empty; 
      if (i > 0) 
      { 
       o += chars[i - 1]; 
      } 
      if (++i < chars.Length) 
      { 
       o += chars[i] 
      } 
      output.Add(o); 
     } 
    } 
    return output.ToArray(); 
} 
+0

Hãy để tôi kiểm tra nó và cho bạn biết .... – Devjosh

+0

nó hoạt động phần nào gần @zenxer nhưng điều này là nhận được thất bại trong một trường hợp "AB-CD-K sau đó tôi muốn nó được thay thế như BC và DK cả hai trường hợp chuỗi khác nhau" này đặc biệt là – Devjosh

+0

Bạn ngụ ý gì bởi các cá thể chuỗi riêng biệt? – Zenexer

1

Đúng tôi nếu tôi sai nhưng chắc chắn tất cả các bạn cần làm là loại bỏ các '-'?

như thế này:

"A-B-C".Replace("-",""); 
+0

Cảm ơn @steve nhưng chuỗi của tôi được người dùng nhập và điều này không nhất thiết là mỗi khối chứa ký tự onw chỉ có thể có 2 hoặc 3 hoặc có thể là số ký tự như AB-CD hoặc ABC-DE v.v. – Devjosh

4

Sử dụng:

string[] input = { 
         "A-B-C", 
         "AB-CD", 
         "ABC-D-E", 
         "AB-CD-K" 
        }; 

var regex = new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled); 

var result = input.Select(s => string.Concat(regex.Matches(s) 
    .Cast<Match>().Select(m => m.Value))); 

foreach (var s in result) 
{ 
    Console.WriteLine(s); 
} 

Output:

ABC 
BC 
CDE 
BCDK 
+0

Cụm từ thông dụng là quá mức cần thiết cho việc này. – Zenexer

+0

@Kirill Polishchuk cảm ơn nhưng nó đang hạn chế vấn đề chỉ với một tập hợp các chuỗi tôi muốn một giải pháp chung tôi không thể giả định sự kết hợp của các ký tự và - người dùng có thể nhập vào trường này – Devjosh

+0

@Devjosh, Ý bạn là gì? Tôi cung cấp regex có thể được áp dụng cho các bộ chuỗi khác nhau. –

1

Bạn thậm chí có thể giải quyết việc này với một lớp lót (mặc dù một chút xấu xí):

String.Join(String.Empty, input.Split('-').Select(q => (q.Length == 0 ? String.Empty : (q.Length > 1 ? (q.First() + q.Last()).ToString() : q.First().ToString())))).Substring(((input[0] + input[1]).ToString().Contains('-') ? 0 : 1), input.Length - ((input[0] + input[1]).ToString().Contains('-') ? 0 : 1) - ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-') ? 0 : 1)); 

đầu tiên nó chia tách chuỗi thành một mảng trên mỗi '-', sau đó nó concatenates chỉ là người đầu tiên và ký tự cuối cùng của mỗi chuỗi (hay chỉ là nhân vật duy nhất nếu chỉ có một, và nó rời chuỗi rỗng nếu không có gì ở đó), và sau đó nó nối kết quả đếm được với một String. Cuối cùng, chúng tôi rút ra lá thư đầu tiên và lá thư cuối cùng, nếu chúng không nằm trong phạm vi cần thiết.

tôi biết, đó là xấu xí, tôi chỉ nói rằng nó có thể ..

Có lẽ đó là cách tốt hơn để chỉ cần sử dụng một đơn giản

new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled) 

và sau đó làm việc với điều đó ..

EDIT @Kirill Polishchuk là nhanh hơn .. giải pháp của ông nên làm việc ..

EDIT 2

Sau khi câu hỏi đã được cập nhật, đây là một đoạn trích rằng nên làm như lừa:

 string input = "A-B-C"; 
     string s2; 
     string s3 = ""; 
     string s4 = ""; 
     var splitted = input.Split('-'); 
     foreach(string s in splitted) { 
      if (s.Length == 0) 
       s2 = String.Empty; 
      else 
       if (s.Length > 1) 
        s2 = (s.First() + s.Last()).ToString(); 
       else 
        s2 = s.First().ToString(); 
      s3 += s4 + s2; 
      s4 = " and "; 
     } 
     int beginning; 
     int end; 
     if (input.Length > 1) 
     { 
      if ((input[0] + input[1]).ToString().Contains('-')) 
       beginning = 0; 
      else 
       beginning = 1; 
      if ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-')) 
       end = 0; 
      else 
       end = 1; 
     } 
     else 
     { 
      if ((input[0]).ToString().Contains('-')) 
       beginning = 0; 
      else 
       beginning = 1; 
      if ((input[input.Length - 1]).ToString().Contains('-')) 
       end = 0; 
      else 
       end = 1; 
     } 
     string result = s3.Substring(beginning, s3.Length - beginning - end); 

Nó không phải rất thanh lịch, nhưng nó phải làm việc (không kiểm tra mặc dù ..). nó hoạt động gần giống như một lớp lót phía trên ...

+0

Trong khi các phương pháp này xuất hiện thanh lịch, chúng không hiệu quả nhất. Tôi có thể đi theo con đường hiệu quả hơn, nhưng nó sẽ phụ thuộc vào ứng dụng. Nếu tôi đã sử dụng rất nhiều regexes, tại sao không thêm nhiều hơn nữa? – Zenexer

+0

Tôi đã cập nhật câu trả lời .. – ramsesoriginal

Các vấn đề liên quan