2011-10-13 12 views
6

Mam dynamicznie utworzony ciąg jak - part1.abc.part2.abc.part3.abcGet przedostatniej pozycji znaku z łańcucha

w tym ciągu Chcę wiedzieć pozycję przedostatni „” tak, że mogę podzielić ciąg jako part1.abc.part2.abc i part3.abc

daj mi znać, czy istnieje jakaś bezpośrednia metoda dostępna, aby to uzyskać?

+0

nie jest jasne, czego chcesz. czy chcesz podzielić 'a.b.c' na' a, b, c'? – Deeptechtons

+1

Możesz otrzymać tablicę ciągów po podzieleniu na ("."), Ostatnie 2 słowa z tablicy to "part3" i "abc". Baw się z tym – Rob

+1

Dzielenie wielu ciągów znaków (tylko w celu uzyskania dwóch ostatnich) *** może być problemem z pamięcią/wydajnością, powstanie wiele niepotrzebnych ciągów. – bitbonk

Odpowiedz

14
string str = "part1.abc.part2.abc.part3.abc"; 
int ix1 = str.LastIndexOf('.'); 
int ix2 = ix1 > 0 ? str.LastIndexOf('.', ix1 - 1) : -1; 

Zawsze są miłośnikami regexes (i jQuery), więc dam rozwiązanie Regex (dla rozwiązania jQuery będziesz musiał czekać :-)):

var match = Regex.Match(str, @"\.[^\.]*\.", RegexOptions.RightToLeft); 
int ix = match.Success ? match.Index : -1; 

(zauważ, że jestem hater Regeksów, podaję ci to, abyś miał wystarczająco dużo liny, żeby się powiesić, jeśli tak wybierzesz).

Należy pamiętać, że używam opcji RegexOptions.RightToLeft, aby Regex rozpoczynał się od ostatniego znaku.

5

Można użyć metody String.LastIndexOf('.') aby uzyskać pozycję ostatniego kropkę/czas, a następnie użyć tej pozycji w drugim wywołaniu LastIndexOf('.') dostać się na przedostatnim, np:

string aString = "part1.abc.part2.abc.part3.abc"; 
int lastPos = aString.LastIndexOf('.'); 

int lastPosButOne = aString.LastIndexOf('.', lastPos - 1); 

Ale Zalecam użycie String.Split('.'), która da ci tablicę z częściami łańcuchowymi, potem możesz wziąć ostatni, ale jeden, np.

string aString = "part1.abc.part2.abc.part3.abc"; 
string[] parts = aString.Split('.'); 

string lastPartButOne = parts[parts.Length - 1]; 
1

Można użyć metody String.Split(), która zwraca tablicę podzielonych elementów. Możesz wtedy połączyć pierwsze 2 i opuścić ostatnie.

1

Wypróbuj metodę klasy LastIndexOf klasy łańcuchowej.

1

Co "part1.abc.part2.abc.part3.abc".Split('.') w tym przypadku dostaniesz tablicę wszystkich podciągów

nadzieję, że to pomaga.

2

O ile mi wiadomo, nie ma gotowego rozwiązania. Jednym ze sposobów byłoby znalezienie ostatniego "." za pomocą LastIndexOf ciągu, a następnie ponownie wyszukaj ostatni punkt, tym razem używając przeciążenia, które pozwala określić indeks początkowy i liczbę, używając indeksu pierwszego połączenia jako parametru do zliczenia.

0

To byłoby rozwiązanie, w najlepszej możliwej wydajności (prawdopodobnie nie będzie się znacznie szybciej i lekka pamięć niż ten, chyba że chcesz iść drogą niebezpieczne):

public static int LastIndexOf(this string str, char charToSearch, int repeatCound) 
{ 
    int index = -1; 
    for(int i = str.Length - 1; i >= 0, numfound < repeatCound) 
    { 
     if(str[i] == charToSearch) 
     { 
      index = i; 
      numfound++; 
     } 
    } 

    return index; 
} 
1

Based na odpowiedź @ bitbonka. Użyłem pod kodem, który jest repliką funkcji RAT() z VFP.

public static int RightIndexAt(this string expressionToSearch, char charToSearch, int occurence) 
    { 
     //Validate parameter 
     if (occurence < 1) 
      return -1; 

     int index = -1; 
     int numfound = 0; 

     for (int count = expressionToSearch.Length - 1; count >= 0; count--) 
     { 
      if (expressionToSearch[count].Equals(charToSearch)) 
      { 
       index = count; 
       numfound++; 
      } 

      if (numfound.Equals(occurence)) 
       break; 
     } 

     return numfound < occurence ? -1 : index; 
    } 
4

Oto inne rozwiązanie:

  string aString = "part1.abc.part2.abc.part3.abc"; 
     // Getting string until last dot 
     var untilLastDot = aString.Substring(0, aString.LastIndexOf(".")); 
     // Now we have string until last dot and last dot here will be last but one 
     // and getting text from last but one dot to end 
     string lastWordButOne = aString.Substring(untilLastDot.LastIndexOf(".") + 1); 
     // Result: part3.abc 

nadzieja pomaga, dzięki!

Powiązane problemy