C #의 문자열에서 마지막 네 문자를 어떻게 얻습니까?


309

문자열이 있다고 가정하십시오.

"34234234d124"

이 문자열의 마지막 네 문자 인을 얻고 싶습니다 "d124". 사용할 수 있습니다SubString 있지만 변수 이름 지정을 포함하여 몇 줄의 코드가 필요합니다.

이 결과를 C #으로 하나의 표현식으로 얻을 수 있습니까?


3
4 자 미만인 경우 무엇을 원하십니까?
에이전트

12
4 > mystring.length ? mystring : mystring.Substring(mystring.length -4);
Jodrell

3
파이썬에서 해결책은 간단 "hello world"[-4:]합니다. 향후 버전의 C #에서 쉽게 사용할 수 있기를 바랍니다.
대령 패닉

@ColonelPanic, 이제 C # 8.0으로 가능합니다 : "hello world"[^4..]:-)
Frode Evensen

답변:


407
mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?

문자열의 길이가 4 이상인 경우 더 짧습니다.

mystring.Substring(mystring.Length - 4);

13
또한 mystring길이가 4 자 미만이면 실패합니다 .
George Duckett

3
+1 난 당신이 약간 @ DTB의보다 더 읽을 생각하기 때문에
조지 Duckett

OP가 이미 알고있는 몇 줄의 코드를 가져 와서 한 줄에 넣는 것은 실제로는 하나의 표현과 같지 않습니다.
Buh Buh

1
나는 그것을 좋아한다. 간단하고 우아하며 최대 값을 취하므로 문자열이 0보다 작 으면 인덱스에서 예외를 얻지 못합니다.
Bretticus

+1 단순하고 모든 기지를 포괄합니다. Stecya가 제안한 확장 방법도 좋지만 한 번만 수행하면 약간 과도하게 죽일 수 있습니다.
Morvael

205

확장 방법을 사용할 수 있습니다 :

public static class StringExtension
{
    public static string GetLast(this string source, int tail_length)
    {
       if(tail_length >= source.Length)
          return source;
       return source.Substring(source.Length - tail_length);
    }
}

그런 다음 전화하십시오.

string mystring = "34234234d124";
string res = mystring.GetLast(4);

11
나는 이것을 좋아하지만 아마 Last ()라고 부를 것입니다. 모든 Substring ()은 GetSubstring ()이 아닙니다.
Buh Buh

21
Linq Extension Last ()와 Last가 충돌 할 때 Tail ()이라고 부를 수 있습니다.
Craig Curtis

5
"1 줄보다 길다"는 +1 줄 절약으로 인해 읽을 수없는 코드를 보는 것은 매우 성가신 일입니다.
Fabio Milheiro

2
또는 @RJ 프로그래머의 답변에 따라 VisualBasic과 일관성을 유지하기 위해 Right ()으로 호출하십시오 (한 함수에 대해서만 다른 어셈블리를 추가하고 싶지 않습니다).
christutty

3
나는이 솔루션을 좋아한다.
Luke

46

당신이해야 할 일은 ..

String result = mystring.Substring(mystring.Length - 4);

2
길이가 4보다 작 으면 예외를 던지 길 원치 않으면 ...
Milos Mrdovic

45

좋아, 이것이 오래된 게시물 인 것을 보았지만 프레임 워크에 이미 제공된 코드를 다시 작성하는 이유는 무엇입니까?

프레임 워크 DLL "Microsoft.VisualBasic"에 대한 참조를 추가하는 것이 좋습니다.

using Microsoft.VisualBasic;
//...

string value = Strings.Right("34234234d124", 4);

8
VB 기능을 사용하는 좋은 예
Brian White

3
사랑해. 내 프로그래밍 경험의 대부분은 VB, 나는 내가 너무 잘 알고 있다는 사람들의 모든 기능을 사용할 수 있다는 것을 발견 있도록 최고입니다
벤 Strombeck

6
MS.VB를 사용하는 것이 좋은 아이디어인지 결코 알 수 없습니다. 왜 VisualBasic네임 스페이스 로 분류 됩니까? TextFieldParser또 다른 예입니다. 이러한 유틸리티가 왜 그렇게 이상하게 고려됩니까?
ruffin

6
나는 이것이 받아 들여야 할 답변이라고 생각합니다. 왜 바퀴를 재발 명합니까?
Zack

2
@Bomboca : Microsoft가 Visual Basic을 계속 지원하는 한 계속 될 것입니다. 4.6 릴리스에 포함되어 있으며 MS에서 개발 언어로 VB.Net 지원을 중단하려는 명시 적이거나 암시적인 내용을 찾을 수 없습니다.
RJ 프로그래머

30
string mystring = "34234234d124";
mystring = mystring.Substring(mystring.Length-4)

26

서브 스트링 사용 은 실제로 매우 짧고 읽기 쉽습니다.

 var result = mystring.Substring(mystring.Length - Math.Min(4, mystring.Length));
 // result == "d124"

17

지연된 실행으로 인해 너무 나쁘게 수행해서는 안되는 또 다른 대안은 다음과 같습니다 .

new string(mystring.Reverse().Take(4).Reverse().ToArray());

목적을위한 확장 방법 mystring.Last(4)은 분명히 가장 깨끗한 솔루션이지만 조금 더 많은 작업이 필요합니다.


1
@BrianWhite 사람들은 새해가 끝나고 까다 롭습니까?
Konrad Viltersten

1
좋은 해결책. 나는 그것을 좋아한다. 그러나 올바른 문자열을 얻으려면 다른 Reverse를 잊어 버렸습니다. 다음과 같아야합니다. new string (mystring.Reverse (). Take (4) .Reverse (). ToArray ());
Yuri Morales

Aah 그렇습니다, 당신은 맞습니다-내 정신 컴파일러는 그렇게 생각하지 않았습니다. 슬프게도 그것은 더 나빠 보이게 만듭니다! :)
Andre Luus

1
ToArray의 어떤 실행이 지연되지 않기 때문에

1
@ BjörnAliGöransson, 내 요점은 Reverse().Take(4).Reverse()각각 전체 문자열을 열거하지 않고 최종 ToArray호출 에서만 발생 한다는 것을 이해하지 못한다고 생각합니다 . 지연된 실행과 같은 것이 없으면로 변환됩니다 Reverse().ToArray().Take(4).ToArray().Reverse().ToArray(). 물론 이것은 그 확장이 내가 연기하지 않은 유형이라고 가정합니다. String 생성자는 IEnumerable을 허용하지 않으므로 해당 시점의 배열에 열거해야합니다.
Andre Luus

17

SubstringC #의 방법을 간단하게 사용할 수 있습니다 . 예를 들어.

string str = "1110000";
string lastFourDigits = str.Substring((str.Length - 4), 4);

결과 0000을 반환합니다.


7
이 답변은 28 회 반복되었으며 다시 추가 했습니까? 그리고 왜 수신하는 것 대신에 두 개의 매개 변수 과부하를 사용 startIndex합니까?
Andrew

@Amit Kumawat을 공유해 주셔서 감사합니다.
Daryl

12

간단한 해결책은 다음과 같습니다.

string mystring = "34234234d124";
string last4 = mystring.Substring(mystring.Length - 4, 4);

7
mystring = mystring.Length > 4 ? mystring.Substring(mystring.Length - 4, 4) : mystring;

좋았지 만, 당신이 =아니었다 고 생각합니다 =+.
dotancohen

1
mystring.Substring (mystring.Length-4, 4)는 다음과 같습니다. mystring.Substring (mystring.Length-4)
Moe Howard


6

이전 답변과 비교할 때 주요 차이점은 입력 문자열이 다음과 같은 경우이 코드가 고려한다는 것입니다.

  1. 없는
  2. 요청한 길이보다 길거나 일치
  3. 요청한 길이보다 짧습니다.

여기있어:

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

    public static string MyLast(this string str, int length)
    {
        if (str == null)
            return null;
        else if (str.Length >= length)
            return str.Substring(str.Length - length, length);
        else
            return str;
    }
}

4

정의:

public static string GetLast(string source, int last)
{
     return last >= source.Length ? source : source.Substring(source.Length - last);
}

용법:

GetLast("string of", 2);

결과:


3

이것은 길이 문자열에 대해 실패하지 않습니다.

string mystring = "34234234d124";
string last4 = Regex.Match(mystring, "(?!.{5}).*").Value;
// last4 = "d124"
last4 = Regex.Match("d12", "(?!.{5}).*").Value;
// last4 = "d12"

이것은 당면한 작업에 과잉 일 수 있지만 추가 유효성 검사가 필요한 경우 정규 표현식에 추가 할 수 있습니다.

편집 : 이 정규식이 더 효율적이라고 생각합니다.

@".{4}\Z"

5
확실히 남용. 나는 이것을 위해 간단한 문자열 메소드를 고수 할 것이다.
tsells

두 번째 변형은 세 글자 인수로 호출 될 때 세 글자 문자열을 반환하지 않으므로 네거티브 lookahead를 사용하는 첫 독창적 인 버전과 동일하지 않습니다! :-)
avl_sweden

3

generic을 사용하십시오 Last<T>. IEnumerable문자열을 포함 하여 ANY와 함께 작동 합니다.

public static IEnumerable<T> Last<T>(this IEnumerable<T> enumerable, int nLastElements)
{
    int count = Math.Min(enumerable.Count(), nLastElements);
    for (int i = enumerable.Count() - count; i < enumerable.Count(); i++)
    {
        yield return enumerable.ElementAt(i);
    }
}

그리고 문자열에 대한 특정 것 :

public static string Right(this string str, int nLastElements)
{
    return new string(str.Last(nLastElements).ToArray());
}

1
와. 지나침. 아마 enumerable.Skip (enumerable.Count ()-nLastElements)?
Buh Buh

나는 이것이 과잉 행동에 대해 @BuhBuh에 동의하지 않습니다. 그러나 나는 "마지막"을 "오른쪽"보다 이름으로 선호합니다. 기존 Last of IEnumerable <T> 오버로드에 대해 약간 압박합니다. 나도 "건너 뛰기"에 기대어있다.
명백히 부인할 수 없음

나는이 해결책을 좋아한다. IEnumerable을 배울 때 간단하지는 않지만 모욕적입니다.
pKarelian

1

원하는 결과를 얻을 수있는 다양한 소스에서 수정 된 코드를 함께 던졌습니다. 음수의 int 값, 문자열의 길이를 초과하는 int 값 및 시작 색인보다 작은 종료 색인을 허용했습니다. 마지막 경우이 메소드는 역순 하위 문자열을 반환합니다. 많은 의견이 있지만, 불분명하거나 미친 것이 있으면 알려주십시오. 나는 이것을 사용하여 내가 무엇을 사용할 수 있는지 보았습니다.

    /// <summary>
    /// Returns characters slices from string between two indexes.
    /// 
    /// If start or end are negative, their indexes will be calculated counting 
    /// back from the end of the source string. 
    /// If the end param is less than the start param, the Slice will return a 
    /// substring in reverse order.
    /// 
    /// <param name="source">String the extension method will operate upon.</param>
    /// <param name="startIndex">Starting index, may be negative.</param>
    /// <param name="endIndex">Ending index, may be negative).</param>
    /// </summary>
    public static string Slice(this string source, int startIndex, int endIndex = int.MaxValue)
    {
        // If startIndex or endIndex exceeds the length of the string they will be set 
        // to zero if negative, or source.Length if positive.
        if (source.ExceedsLength(startIndex)) startIndex = startIndex < 0 ? 0 : source.Length;
        if (source.ExceedsLength(endIndex)) endIndex = endIndex < 0 ? 0 : source.Length;

        // Negative values count back from the end of the source string.
        if (startIndex < 0) startIndex = source.Length + startIndex;
        if (endIndex < 0) endIndex = source.Length + endIndex;         

        // Calculate length of characters to slice from string.
        int length = Math.Abs(endIndex - startIndex);
        // If the endIndex is less than the startIndex, return a reversed substring.
        if (endIndex < startIndex) return source.Substring(endIndex, length).Reverse();

        return source.Substring(startIndex, length);
    }

    /// <summary>
    /// Reverses character order in a string.
    /// </summary>
    /// <param name="source"></param>
    /// <returns>string</returns>
    public static string Reverse(this string source)
    {
        char[] charArray = source.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }

    /// <summary>
    /// Verifies that the index is within the range of the string source.
    /// </summary>
    /// <param name="source"></param>
    /// <param name="index"></param>
    /// <returns>bool</returns>
    public static bool ExceedsLength(this string source, int index)
    {
        return Math.Abs(index) > source.Length ? true : false;
    }

따라서 "This is an extension method"와 같은 문자열이있는 경우 예상되는 몇 가지 예와 결과가 있습니다.

var s = "This is an extension method";
// If you want to slice off end characters, just supply a negative startIndex value
// but no endIndex value (or an endIndex value >= to the source string length).
Console.WriteLine(s.Slice(-5));
// Returns "ethod".
Console.WriteLine(s.Slice(-5, 10));
// Results in a startIndex of 22 (counting 5 back from the end).
// Since that is greater than the endIndex of 10, the result is reversed.
// Returns "m noisnetxe"
Console.WriteLine(s.Slice(2, 15));
// Returns "is is an exte"

이 버전이 누군가에게 도움이 되길 바랍니다. 음수를 사용하지 않으면 정상적으로 작동하며 범위를 벗어난 매개 변수에 대한 기본값을 제공합니다.


1
string var = "12345678";

if (var.Length >= 4)
{
    var = var.substring(var.Length - 4, 4)
}

// result = "5678"

1

마지막 문자에서 10자인 문자열 사이에 문자열을 원하고 3 자만 필요하다고 가정합니다.

의 말을하자 StreamSelected = "rtsp://72.142.0.230:80/SMIL-CHAN-273/4CIF-273.stream"

위의 "273"데이터베이스 쿼리에서 사용할 추출을 추출해야 합니다.

        //find the length of the string            
        int streamLen=StreamSelected.Length;

        //now remove all characters except the last 10 characters
        string streamLessTen = StreamSelected.Remove(0,(streamLen - 10));   

        //extract the 3 characters using substring starting from index 0
        //show Result is a TextBox (txtStreamSubs) with 
        txtStreamSubs.Text = streamLessTen.Substring(0, 3);

이 질문은 문자열에서 마지막 네 문자를 명시 적으로 요청합니다. 문자열 중간에서 물건을 추출하는 것과 관련된 다른 질문에 대답하는 것 같습니다. 또한 Substring이미 시작점과 길이를 전달할 수 있으므로 Remove처음을 제거하는 데 사용하지 않고 왜 사용하지 않는지 잘 모릅니다 .
Chris

0

업데이트 2020 : C # 8.0은 마침내 이것을 쉽게 만듭니다.

> "C# 8.0 finally makes this easy"[^4..]
"easy"

같은 방식으로 배열을 슬라이스 할 수도 있습니다 ( 인덱스 및 범위 참조) .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.