Pytanie Wypakuj tylko prawe, większość n liter z ciągu


Jak wyodrębnić podciąg, który składa się z sześciu pierwszych liter z drugiego łańcucha?

Przykład: mój ciąg to "PER 343573". Teraz chcę wyodrębnić tylko "343573".

Jak mogę to zrobić?


81
2017-11-12 13:54


pochodzenie


Możesz użyć kodu źródłowego dla metody VB.NET Right. Najpierw musisz przekonwertować do C #: referencesource.microsoft.com/#Microsoft.VisualBasic/... Konwertuj na C # za pomocą converter.telerik.com - D-Money
ale kod VB opiera się na funkcji c # podłańcuchowej w pliku strings.sc - Our Man in Bananas
To naprawdę nie jest dobry sposób na zrobienie tego, ale jeśli jesteś w szczypta, możesz dodać odniesienie do Microsoft.VisualBasic.dll i użyć prawej metody. To nie jest metoda rozszerzenia. Musisz użyć tego w ten sposób: string endOfString = Strings.Right(wholeString, 6); - Alan McBee - MSFT
Możliwy duplikat Jak zdobyć 4 ostatnie znaki z ciągu w c #? - drzaus


Odpowiedzi:


string SubString = MyString.Substring(MyString.Length-6);

118
2017-11-12 13:55



To podejście nie działa poprawnie, jeśli ciąg znaków nie jest tak długi, jak wymagana liczba znaków. - stevehipwell
W zależności od tego, co dokładnie chce OP, można również wyrzucać na nim wyrażenia regularne. Jeśli chce tylko numeru na końcu łańcucha, jest to zdecydowanie najbardziej bezbolesne rozwiązanie, zwłaszcza gdy liczba cyfr może się różnić w późniejszym uaktualnieniu oprogramowania. - Joey
@Johannes Rössel - Jestem wielkim fanem wyrażeń regularnych (zobacz moje odpowiedzi), ale nigdy nie poleciłbym im takiej prostej sytuacji. Każda z odpowiedzi wykorzystujących wrapper funkcji jest lepiej dostosowana do obsługi kodu niż wyrażenie regularne. Metoda rozszerzenia (lub standardowa funkcja, jeśli .NET 2.0) jest najlepszym rozwiązaniem. - stevehipwell
Nie tak, jeśli długość nie jest pożądana, podział działa lepiej. - Mahdi Tahsildari
@James - być tak samo pępiastym, tylko tytuł wspomniany "n liter". Właściwe zadane pytanie dotyczyło "prawych sześciu liter" :) - Chris Rogers


Napisz metodę rozszerzenia, aby wyrazić Right(n); funkcjonować. Funkcja powinna obsłużyć puste lub puste ciągi zwracające pusty ciąg, łańcuchy krótsze niż maksymalna długość zwracające oryginalny ciąg i łańcuchy dłuższe niż maksymalna długość zwracająca maksymalną długość znaków znajdujących się na samym końcu.

public static string Right(this string sValue, int iMaxLength)
{
  //Check if the value is valid
  if (string.IsNullOrEmpty(sValue))
  {
    //Set valid empty string as string could be null
    sValue = string.Empty;
  }
  else if (sValue.Length > iMaxLength)
  {
    //Make the string no longer than the max length
    sValue = sValue.Substring(sValue.Length - iMaxLength, iMaxLength);
  }

  //Return the string
  return sValue;
}

59
2017-11-12 14:03



Indeks początkowy nie może być mniejszy niż 0. - James
@James - To nie będzie takie sValue.Length > iMaxLength przed wywołaniem podciągu! - stevehipwell
Świetna odpowiedź, ale było trochę podwójnie, aby zobaczyć węgierski zapis w kodzie C #. - Jerad Rose
@JeradRose - Pracuję w projekcie, w którym baza kodu ewoluowała z aplikacji VB3 (większość z nich to VB.NET), więc są pewne pozostałości. - stevehipwell
@Jalle, VB.NET ma lewy, prawy i środkowy jako funkcje najwyższego poziomu, plus wiele innych pomocnych rzeczy, które nie są częścią C #. Nie wiem dlaczego, ponieważ wiele z nich to przyzwoite funkcje. - ingredient_15939


Prawdopodobnie lepiej użyć metody rozszerzenia:

public static class StringExtensions
{
    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - length, length);
    }
}

Stosowanie

string myStr = "ABCDEPER 343573";
string subStr = myStr.Right(6);

37
2017-11-12 13:56



Co jeśli str jest pusty? - stevehipwell
Wtedy rzuciłby wyjątek NullReferenceException tak, jakby próbował użyć dowolnej metody w pustym ciągu ... - James
str.Length - length może być ujemny. Również drugi parametr jest opcjonalny. Nie trzeba przekazywać długości. - JMS10
@ JMS10 to z pewnością może być, ale to bardziej dotyczy rozmówców niż moje. Ponadto, tak, fair point, możesz użyć override, który bierze tutaj pojedynczy parametr. - James


using System;

public static class DataTypeExtensions
{
    #region Methods

    public static string Left(this string str, int length)
    {
        str = (str ?? string.Empty);
        return str.Substring(0, Math.Min(length, str.Length));
    }

    public static string Right(this string str, int length)
    {
        str = (str ?? string.Empty);
        return (str.Length >= length)
            ? str.Substring(str.Length - length, length)
            : str;
    }

    #endregion
}

Nie powinien zawierać błędu, zwraca puste wartości jako pusty łańcuch, zwraca przycięte lub podstawowe wartości. Użyj go jak "testx" .Left (4) lub str.Right (12);


22
2017-07-07 20:48





MSDN

String mystr = "PER 343573";
String number = mystr.Substring(mystr.Length-6);

EDIT: zbyt wolno ...


13
2017-11-12 13:57





jeśli nie jesteś pewien długości napisu, ale masz pewność, że liczba słów (zawsze 2 słowa w tym przypadku, np. "xxx yyyyyy"), lepiej użyć podziału.

string Result = "PER 343573".Split(" ")[1];

to zawsze zwraca drugie słowo ciągu znaków.


8
2017-07-03 13:04





Nie jest to dokładnie to, o co prosisz, ale patrząc na przykład, wygląda na to, że szukasz numerycznej sekcji napisu.

Jeśli tak jest zawsze, dobrym sposobem na to byłoby użycie wyrażenia regularnego.

var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;

6
2017-11-12 14:16



+1 dla innego podejścia. - stevehipwell
-1 wyrażenia regularne są trochę przesadzone w przypadku czegoś takiego, zwłaszcza gdy istnieją już wbudowane metody, aby to zrobić. - James
Nie twierdzę, że korzystam z tej metody, jeśli naprawdę potrzebujesz tylko ostatnich 6, ale jeśli Twoim celem jest wyodrębnienie liczby (takiej jak identyfikator), która może w przyszłości ulec zmianie na 5 lub 7 cyfr, to lepszy sposób. - chills42
Stara odpowiedź, ale +1 do obsługi wyrażeń regularnych. Zwłaszcza, że ​​nie ma (wciąż) żadnych wbudowanych metod w implementacji String Stringa dla robienia tego @ James. W przeciwnym razie to pytanie może nigdy nie istniało. - CrazyIvan1974
@ CrazyIvan1974 nie wiesz, dlaczego wspomniałeś o mnie w swoim komentarzu - James


Użyj tego:

String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
    numbers = text.Substring(text.Length - 6);
}

5
2017-11-12 13:55



Co jeśli text ma wartość null? - stevehipwell


Odgadnięcie Twoich wymagań, ale następujące wyrażenie regularne przyniesie tylko 6 znaków alfanumerycznych przed końcem łańcucha i nie pasuje do niego w inny sposób.

string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;

5
2017-11-12 15:46



Czy to rozwiązanie nie w sposób uzasadniony spełnia niejednoznaczne wymagania? Jeśli nie, proszę wyjaśnij swoje głosowanie w dół. - Wade