2017-06-20 154 views
1

我有一個字符串像AX_1234X_12345_X_CXY,我想從第一個下劃線_即從1234X1234後刪除X。所以最終的輸出將會像AX_1234_12345_X_CXY。怎麼做??如果我使用.Replace("X", "")它將替換所有X我不想如何從c#中的字符串替換特定的字符?

+1

可能的重複[替換第二次出現?與&(https://stackoverflow.com/questions/23547100/replace-second-occurence-of-with-an) – Software2

+0

我認爲正則表達式將是你的答案。 – Ahmar

+1

'1234'的語義是什麼?你想要完成什麼,更普遍?它會始終是四位數字後跟一個'X'?提取一般模式,然後使用正則表達式進行搜索和替換。 –

回答

4

可以遍歷槽從'_'中第一次出現的字符串。
您可以使用IndexOf()找到'_'的第一個匹配項。
當循環變爲'X'時,它不會將其追加到「固定字符串」。

private static void Func() 
{ 
    string Original = "AX_1234X_12345_X_CXY"; 
    string Fixed = Original.Substring(0, Original.IndexOf("_", 0)); 
    // in case you want to remove all 'X`s' after first occurrence of `'_'` 
    // just dont use that variable 
    bool found = false; 

    for (int i = Original.IndexOf("_", 0); i < Original.Length; i++) 
    { 
     if (Original[i].ToString()=="X" && found == false) 
     { 
      found = true; 
     } 
     else 
     { 
      Fixed += Original[i]; 
     } 
    } 

    Console.WriteLine(Fixed); 
    Console.ReadLine(); 
} 
1

一種方法是String.Remove,因爲你可以告訴正是從刪除。如果有問題的「X」總是在同一個地方,你可以使用:

string newString = old.Remove(7,1); 

這將刪除1個字符起7位(從零作爲字符串的開頭算起)。

如果不是總是在相同的字符位置,你可以嘗試:

int xPos = old.IndexOf("X"); 
string newString = old.Remove(xPos,1); 

編輯:

基於OP的評論中,「X」我們針對剛剛發生後第一強調個性,讓我們離指數第一個下劃線的:

int iPosUnderscore = old.IndexOf("_"); 
string newString = old.Remove(iPosUnderscore + 1 ,1); // start after the underscore 
+0

如果字符串中想要的之前有'x',則第二個建議將不起作用。 –

+0

同意。我根據他的確切問題回答了我的答案,這個答案保留了後面輸入的X個字符。 – TomServo

+1

我只是想得到nitpicky一秒,並提到你的第二塊代碼中的變量名是無效的。 –

1
string original = @"AX_1234X_12345_X_CXY"; 

original = @"AX_1234_12345_X_CXY"; 
+6

那麼,它的工作原理... – Adrian

1

試着看一下string.IndexOfstring.IndexOfAny

string s = "AX_1234X_12345_X_CXY"; 
string ns = HappyChap(s); 

public string HappyChap(string value) 
{ 
     int start = value.IndexOf("X_"); 
     int next = start; 

     next = value.IndexOf("X_", start + 1); 
     if (next > 0) 
     { 
      value = value.Remove(next, 1); 
     } 

     return value; 
} 
+0

循環不需要,如果只有第二次發生 – eschneider

+0

我們並不真正知道這裏的模式。那麼如果我們有「AX_1234C_12345_X_CXY」,它會給你一個「AX_1234C_12345__CXY」的結果 –

+0

我們不是這個問題缺乏細節。但我認爲使用的主要概念是IndexOf – eschneider

2

爲什麼不好老IndexOfSubstring

string s = "AX_1234X_12345_X_CXY"; 

    int pUnder = s.IndexOf('_'); 

    if (pUnder >= 0) { // we have underscope... 
    int pX = s.IndexOf('X', pUnder + 1); // we should search for X after the underscope 

    if (pX >= 0) // ...as well as X after the underscope 
     s = s.Substring(0, pX) + s.Substring(pX + 1); 
    } 

    Console.Write(s); 

結果:

AX_1234_12345_X_CXY 
+0

這比我的正則表達式解決方案更快。但是,如果你想讓你的解決方案快兩倍,那就改爲:s = s.Remove(pX,1);而不是你的子串。 –

0

當且僅當這始終是格式,那麼它應該是不包括在該位的X結合原文子的一個簡單的事情。但是運營商並沒有說明情況總是如此。因此,如果這是永遠的格式和相同的字符位置始終刪除,那麼你可以簡單地只是

string s = "AX_1234X_12345_X_CXY"; 
    string newstring = s.Substring(0, 7) + s.Substring(8); 

確定的基礎上,只有第二組數字是長度可變的,然後你可以這樣做:

int startpos = s.IndexOf('_', 4); 
string newstring = s.Substring(0, startpos - 1) + s.Substring(startpos); 

與此代碼,下面的測試結果中:

"AX_1234X_12345_X_CXY" became "AX_1234_12345_X_CXY" 
"AX_123X_12345_X_CXY" became "AX_123_12345_X_CXY" 
"AX_234X_12345_X_CXY" became "AX_234_12345_X_CXY" 
"AX_1X_12345_X_CXY" became "AX_1_12345_X_CXY" 
+0

它可以varry,只有條件是在第一個下劃線之後,所以它可以是AX_1234X_12345_X_CXY或AX_234X_12345_X_CXY – peter

0

像這樣的東西可以工作。我確定有一個更優雅的解決方案。

string input1 = "AX_1234X_12345_X_CXY"; 
string pattern1 = "^[A-Z]{1,2}_[0-9]{1,4}(X)"; 
string newInput = string.Empty; 
Match match = Regex.Match(input1, pattern1); 
if(match.Success){ 
    newInput = input1.Remove(match.Groups[1].Index, 1); 
}    
Console.WriteLine(newInput); 
相關問題