2016-03-04 12 views
8

Mam ciąg znaków, który wygląda tak: "texthere^D123456_02". Ale chcę, aby mój wynik był D123456.Substring IndexOf in C#

to co robię do tej pory:

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

Z tego usunąć przynajmniej _02, jednak gdy próbuję w ten sam sposób dla ^ potem zawsze wrócić texthere, nawet gdy używam name.IndexOf("^")

Próbowałem też tylko sprawdzić pod kątem ^, aby uzyskać co najmniej wynik: D123456_02, ale nadal taki sam wynik.

Próbowałem nawet name.Replace("^", a następnie użyłem metody podciągu, której użyłem wcześniej. Ale znowu wynik pozostaje taki sam.

texthere nie zawsze ma taką samą długość, więc .Remove() jest wykluczone.

Co robię źle?

Dzięki

+3

Można podzielić na^charakter i tylko zajmują drugą część. Ale myślę, że lepszym rozwiązaniem byłoby użycie Wyrażeń regularnych. – Matthijs

Odpowiedz

8

Kiedy wezwanie Substring nie należy zaczynać od , ale z znaleźć indeks:

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

Chociaż jest to bardziej złożone, to jedyne podejście, które nie tworzy niepotrzebnych i tymczasowych ciągów znaków. – Steve

+0

Awesome, to działało dobrze dzięki: D – Desutoroiya

2

Łatwiejszy sposób byłoby użyć Splitu

string s = "texthere^D123456_02"; 

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

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

Najprostszym rozwiązaniem jest najpierw podzielenie ciągu, a następnie użycie twoje oryginalne rozwiązanie dla drugiej części.

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

Następnie można użyć Podłoża jak poprzednio.

3

Użyj metody String.Split:

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

Albo można użyć RegExp osiągnąć zasadniczo takie same.

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

Cóż, jeśli użyć tego samego kodu, który pisał, że robi to, co trzeba, zacząć pobierać znaki z char 0 i zatrzymać, gdy stwierdzi „^”, więc co dostaniesz to „texthere ".

Jeśli chcesz tylko wartość, a następnie użyj tego:

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

Będzie najpierw usunąć to, co jest po „_” i to, co jest przed „^”.

3

podciągu zajmuje pozycję i długość, więc trzeba rzeczywiście dowiedzieć się, gdzie pozycja daszek jest i gdzie podkreślenia jest obliczenie długości

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] 

Ten Dzieli swój ciąg na wszystkich zdarzeń z _ i^i zwraca listę ciągów po podziale. Ponieważ łańcuch, którego potrzebujesz, D123456, znajdowałby się na pierwszym indeksie (tj. Na drugiej pozycji), wydrukowałem to.

3

Z wyrażeń regularnych

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

jesteś pewny co do odpowiedzi? – Media

+0

tak, jestem pewien @media –

3

użyć wyrażenia regularnego.

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

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

Alternatywą do tego, co już zostało sugerowane jest użycie wyrażenia regularnego:

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

Jeśli dopiero chcąc „d123456” To proste z tylko String.Split() nie ma potrzeby na nic innego. Po prostu określ indeks, który chcesz później. Z tego powodu są przeciążenia Split().

//... 

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

Mam nadzieję, że to pomoże.

3

Spróbuj i daj mi znać jak poszło

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

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

Grupy [0] zwracają cały mecz, powinny to być Grupy [1] – nkoniishvt