2016-03-04 64 views
8

我有一個如下所示的字符串:"texthere^D123456_02"。但我想我的結果是D123456c中的子串索引#

這是我迄今爲止做的:

if (name.Contains("_")) 
{ 
name = name.Substring(0, name.LastIndexOf('_')); 
} 

有了這個,我至少去除_02,但是如果我嘗試^以同樣的方式,然後我總是回來texthere,甚至當我使用name.IndexOf("^")

我也試過只檢查^,得到至少結果:D123456_02但仍然是相同的結果。

我甚至試圖name.Replace("^",然後使用我以前使用的子字符串的方式。但結果仍然保持不變。

texthere並不總是相同的長度,所以.Remove()是不可能的。

我在做什麼錯?

感謝

+3

你可能分裂的^字符,只需要第二部分。但我認爲更好的選擇是使用正則表達式。 – Matthijs

回答

8

當呼叫Substring你不應該從開始,而是從索引找到

String name = "texthere^D123456_02"; 

    int indexTo = name.LastIndexOf('_'); 

    if (indexTo < 0) 
    indexTo = name.Length; 

    int indexFrom = name.LastIndexOf('^', indexTo - 1); 

    if (indexFrom >= 0) 
    name = name.Substring(indexFrom + 1, indexTo - indexFrom - 1); 
+0

雖然更復雜這是唯一不會造成不必要和臨時字符串的方法 – Steve

+0

真棒,這工作得很好謝謝:D – Desutoroiya

2

更簡單的方法是使用分割

string s = "texthere^D123456_02"; 

string[] a = s.Split('^', '_'); 

if (a.Length == 3) // correct 
{ 
} 
2

您最簡單的解決方案是首先拆分字符串,然後使用您的第二部分的原始解決方案。

string name = "texthere^D123456_02"; 
string secondPart = name.Split('^')[1]; // This will be D123456_02 

之後,您可以像以前一樣使用Substring。

3

使用String.Split方法:

var split1 = name.Split('^')[1]; 
    var yourText = split1.Split('_')[0]; 

或者你可以使用正則表達式來實現基本相同。

2
string s = "texthere^D123456_02"; 
      string result= s.Substring(s.IndexOf("^") + 1);//Remove all before 
      result = result.Remove(result.IndexOf("_"));//Remove all after 
3

好吧,如果你使用你發佈相同的代碼,它是做正確的事,你開始從焦炭0檢索字符和結束時,發現「^」,所以你會得到什麼是「texthere 」。

如果你想只值,然後使用此:

name = name.Substring(0, name.LastIndexOf('_')).Substring(name.IndexOf("^") + 1); 

它會先刪除任何是「_」後無論是「^」之前。

3

子串採取的位置和長度,所以實際上你需要找出其中的插入位置是在哪裏下劃線是計算長度

var name = "texthere^D123456_02"; 

if(name.Contains('_')) 
{ 
    var caretPos = name.IndexOf('^') + 1; // skip ahead 
    var underscorePos = name.IndexOf('_'); 
    var length = underscorePos - caretPos; 
    var substring = name.Substring(caretPos, length); 
    Debug.Print(substring); 
}; 
2
String name = "texthere^D123456_02" 
    print name.split('_', '^')[1] 

這在所有情況下將您的字符串_和^並返回分割後的字符串列表。由於您需要D123456的字符串位於第一個索引處(即第二個位置),因此我已打印出該字符串。

3

正則表達式

string s = "texthere^D123456_02"; 
Regex r1 = new Regex(@"\^(.*)_"); 
MatchCollection mc = r1.Matches(s); 
Console.WriteLine("Result is " + mc[0].Groups[1].Value); 
+0

你確定答案? – Media

+0

是的,我確定@media –

3

使用正則表達式。

Regex regex = new Regex(@"\^(.*)_"); 
Match match = regex.Match(name); 

if(match.Success) 
{ 
    name= match.Groups[1].Value 
} 
3

到包括已經提出什麼另一種方法是使用正則表達式:

string result = Regex.Match("texthere^D123456_02", @"\^(.*)_").Groups[1].Value; // D123456 
2

如果你只是想在「d123456」這與剛剛String.Split()簡單,不需要其他任何東西。只需定義你想要的索引。由於這個原因,Split()有過載。

//... 

var source = "texthere^D123456_02"; 
var result = source.Split(new char[] {'^', '_'}, StringSplitOptions.RemoveEmptyEntries)[1]; 
Console.WriteLine(result); 
//Outputs: "D123456" 

希望這會有所幫助。

3

試試這個,讓我知道如何去

string inputtext = "texthere^D123456_02"; 
    string pattern = @".+\^([A-Z]+[0-9]+)\_[0-9]+"; 

    string result = Regex.Match(inputtext, pattern).Groups[1].Value; 
+1

Groups [0]返回整個比賽,它應該是Groups [1] – nkoniishvt