2012-02-08 56 views
6

我正在開發一個使用c#.net的應用程序,在這個應用程序中,如果用戶輸入的輸入包含字符' - '(連字符),那麼我想要直接的鄰居連字符( - )連接,例如,如果用戶輸入連接特殊字符的鄰接字符「 - 」

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 

得到這個我必須準備我的查詢到數據庫。

我希望我明確提出了這個問題,但如果需要更多的澄清讓我知道。 任何幫助將不勝感激。

感謝, Devjosh

+0

正則表達式是這裏的答案([AZ]) - ([AZ]) – Tom 2012-02-08 09:50:07

+0

我應該如何利用它在C#中字符串操作函數會詳細說明更多@Tom – Devjosh 2012-02-08 09:51:53

+0

那麼你想要什麼'ABC-DE'生產? 'CD'和'DE'?這是令人困惑的 – Aliostad 2012-02-08 09:51:57

回答

3

未經檢驗的,但這應該做的伎倆,或者至少是導致您在正確的方向。

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

如果你想每對形成一個獨立的對象數組,試試下面的代碼:

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

請讓我測試它並讓你知道.... – Devjosh 2012-02-08 10:03:34

+0

它的作品有點接近@zenxer,但在一種情況下失敗 「AB-CD-K然後我希望它可以像BC和DK一樣替換爲不同的字符串實例」這一個特別是 – Devjosh 2012-02-08 10:06:41

+0

你是什麼意思由單獨的字符串實例? – Zenexer 2012-02-08 10:08:26

1

糾正我,如果我錯了,但肯定所有你需要做的就是去掉「 - 」?

這樣的:

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

謝謝@steve,但我的字符串是由用戶輸入的,並不是每個塊都包含onw字符,只有它可能包含2或3或可能是n個字符,如AB-CD或ABC-DE等 – Devjosh 2012-02-08 09:47:39

4

用途:

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

輸出:

ABC 
BC 
CDE 
BCDK 
+0

正則表達式對此是矯枉過正。 – Zenexer 2012-02-08 09:53:46

+0

@Kirill Polishchuk謝謝,但它只限制一些字符串的問題我想要一個通用的解決方案,我不能假設什麼組合的字符和 - 用戶可以在這個領域輸入 – Devjosh 2012-02-08 09:58:43

+0

@Devjosh,你是什麼意思?我提供了可應用於不同字符串集的正則表達式。 – 2012-02-08 10:12:15

1

你甚至可以用一行代碼解決這個問題(雖然有點醜):

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

首先它將該字符串數組每個'-',那麼它只能如果只有一個串接第一和每個字符串的最後一個字符(或只是唯一的字符,它離開如果沒有任何內容,則爲空字符串),然後將生成的枚舉連接到一個String。最後,我們刪除第一個和最後一個字母,如果它們不在需要的範圍內。

我知道,它的醜陋,我只是說,它可能..

也許它的方式最好只使用一個簡單的

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

,然後與工作..

編輯 @Kirill舒克也較快。他的解決方案應該工作..

EDIT 2

的問題已被更新後,這裏有一個片段是應該做的伎倆:

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

這不是很優雅,但它應該工作(雖然不是測試..)。它的作用幾乎與上面的單線一樣...

+0

雖然這些方法看起來很優雅,但它們並不是最有效的。我可能會採取更有效的路線,但這取決於應用程序。如果我已經使用了很多正則表達式,爲什麼不添加一個? – Zenexer 2012-02-08 10:23:50

+0

我更新了答案.. – ramsesoriginal 2012-02-08 10:33:37