문자열에서 가장 오른쪽에있는 n 개의 문자 만 추출


110

substring다른 문자에서 가장 오른쪽에있는 6 개의 문자로 구성된 a 를 어떻게 추출 할 수 있습니까?string 있습니까?

예 : 내 문자열은 "PER 343573". 이제 "343573".

어떻게 할 수 있습니까?


VB.NET Right 메서드에 대한 소스 코드를 사용할 수 있습니다. 먼저 C #으로 변환해야합니다. referencesource.microsoft.com/#Microsoft.VisualBasic/… converter.telerik.com을
Darren Griffith

하지만 VB 코드는 strings.sc의 c # Substring 함수에 의존합니다.
Our Man in Bananas

이것은 실제로 그렇게하는 좋은 방법은 아니지만 문제가있는 경우 Microsoft.VisualBasic.dll에 대한 참조를 추가하고 Right 메서드를 사용할 수 있습니다. 확장 방법이 아닙니다. :이처럼 사용할 필요가string endOfString = Strings.Right(wholeString, 6);
앨런 McBee - MSFT

답변:


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

35
이 aproach는 문자열이 필요한 문자 수만큼 길지 않은 경우 올바르게 작동하지 않습니다.
stevehipwell 2009

1
OP가 정확히 무엇을 원하는지에 따라 정규 표현식을 던질 수도 있습니다. 문자열 끝에있는 숫자 만 원하는 경우, 이는 특히 이후 소프트웨어 업그레이드에서 자릿수가 다를 수있는 경우 가장 고통스러운 솔루션입니다.
Joey

2
@Johannes Rössel-저는 정규식의 열렬한 팬이지만 (제 답변 참조) 이와 같은 간단한 상황에 대해서는 결코 추천하지 않습니다. 함수 래퍼를 사용하는 모든 답변은 정규 표현식보다 코드 유지 관리에 더 적합합니다. 확장 방법 (또는 .NET 2.0의 경우 표준 기능)이 최상의 솔루션입니다.
stevehipwell 2009

@ Stevo3000-문자열 길이가 잘못된 경우 던지는 솔루션이 유효한 솔루션입니다. 유일한 해결책은 아니지만 여전히.
마크 L.

3
@James-당혹스러워서 제목 만 "n 개의 글자"로 언급되었습니다. 실제 질문은 "가장 오른쪽에 여섯 글자":)을 요청 제기
크리스 로저스

69

확장 방법을 작성하여 Right(n);함수 . 함수는 빈 문자열을 반환하는 null 또는 빈 문자열, 원래 문자열을 반환하는 최대 길이보다 짧은 문자열 및 가장 오른쪽 문자의 최대 길이를 반환하는 최대 길이보다 긴 문자열을 처리해야합니다.

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;
}

시작 색인도 0보다 작을 수 없습니다.
James

2
@James- sValue.Length > iMaxLength하위 문자열이 호출되기 전과 같지 않습니다 !
stevehipwell 2009

3
좋은 대답이지만 C # 코드에서 헝가리어 표기법을 보는 것은 약간의 이중 작업이었습니다.
Jerad Rose

1
@JeradRose-코드베이스가 VB3 응용 프로그램 (대부분 VB.NET)에서 발전한 프로젝트에서 작업하므로 일부 잔재가 있습니다.
stevehipwell

4
@Jalle, VB.NET에는 Left, Right 및 Mid가 최상위 함수로 포함되어 있으며 C #의 일부가 아닌 다른 많은 유용한 기능도 있습니다. 그들 중 많은 것이 괜찮은 기능이기 때문에 왜 그런지 모르겠습니다.
성분

40

확장 방법을 사용하는 것이 더 좋을 것입니다.

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

용법

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

19
그런 다음 널 문자열에 대해 아무 메서드 나 사용하려고하면 NullReferenceException이 발생합니다.
James

1
str.Length - length음수가 될 수 있습니다. 또한 두 번째 매개 변수는 선택 사항입니다. 길이를 통과 할 필요가 없습니다.
iheartcsharp

1
@ JMS10 그것은 확실히 될 수 있지만 그것은 내 것보다 호출자가 더 걱정합니다. 또한, 예, 여기서 단일 매개 변수를 취하는 재정의를 사용할 수 있습니다.
James

str? .Substring (str.Length-길이, 길이);
Ludwo

26
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
}

오류가 발생하지 않으면 null을 빈 문자열로 반환하고 잘린 값 또는 기본 값을 반환합니다. "testx".Left (4) 또는 str.Right (12);


13

MSDN

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

편집 : 너무 느리다 ...


9

문자열의 길이는 확실하지 않지만 단어 수 (이 경우에는 'xxx yyyyyy'와 같이 항상 2 단어)를 알고 있다면 split을 사용하는 것이 좋습니다.

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

이것은 항상 문자열의 두 번째 단어를 반환합니다.


네; OP의 텍스트에 항상 공백이 있다고 가정 해 보겠습니다. 그의 에서처럼 :)
Christian

1
Hei Christian :) 우리 모두는 몇 줄의 대답 이상을 알고 있습니다. 질문에 간단하게 대답했습니다. 물론 실제 코드에서 고려해야 할 사항이 훨씬 더 많습니다.
Mahdi Tahsildari

7

이것은 정확히 당신이 요구하는 것은 아니지만 예제를 보면 문자열의 숫자 섹션을 찾고있는 것 같습니다.

이것이 항상 그런 경우라면 정규 표현식을 사용하는 것이 좋습니다.

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

-1 정규 표현식은 이와 같은 작업에 약간 과잉입니다. 특히이를 수행하기위한 메서드가 이미 내장되어있는 경우 더욱 그렇습니다.
James

1
마지막 6 자리 만 필요하다면이 방법을 사용한다고 주장하는 것이 아닙니다.하지만 미래의 어느 시점에서 5 자리 또는 7 자리로 변경 될 수있는 숫자 (예 : ID)를 추출하는 것이 목표라면 더 나은 방법입니다.
chills42

1
이전 답변이지만 정규 표현식 사용을 지원하려면 +1합니다. 특히 @James를 수행하기위한 .NET의 String 구현에는 (여전히) 내장 메서드가 없기 때문입니다. 그렇지 않으면이 질문이 존재하지 않았을 수 있습니다.
CrazyIvan1974

@ CrazyIvan1974 왜 당신이 당신의 코멘트에서 저를 언급했는지 확실하지 않습니다
James

5

이것을 사용하십시오 :

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

text? .Substring (text.Length-6)
Ludwo

5

요구 사항을 추측하지만 다음 정규식은 문자열 끝 이전에 6 개의 영숫자 만 생성하고 그렇지 않으면 일치하지 않습니다.

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

이 솔루션이 모호한 요구 사항을 합리적으로 충족하지 않습니까? 그렇지 않은 경우 귀하의 반대 투표를 설명하십시오.
Wade

5

당신이 모든 컴파일 .NET, 사용하고 있기 때문에 MSIL은 단지 참조 Microsoft.VisualBasic을 하고 사용을 마이크로 소프트의 내장 Strings.Right방법 :

using Microsoft.VisualBasic;
...
string input = "PER 343573";
string output = Strings.Right(input, 6);

사용자 지정 확장 방법이나 다른 작업을 만들 필요가 없습니다. 결과는 하나의 참조와 하나의 간단한 코드 라인으로 달성됩니다.

이에 대한 추가 정보로 C #과 함께 Visual Basic 메서드를 사용하는 것은 다른 곳 에서 문서화되었습니다 . 개인적으로 파일을 구문 분석하려고 할 때 처음으로 우연히 발견 했으며 클래스 사용에 대한 이 SO 스레드Microsoft.VisualBasic.FileIO.TextFieldParser.csv 파일 구문 분석에 매우 유용하다는 것을 알았습니다 .


이러한 접근 방식은 또한 여기에 다른 SO 스레드에 설명했다 : stackoverflow.com/a/15255454/2658159
아론 토마스

그것은 정신적입니다! 그러나 VB 녀석으로서 CSharpers에 한 번만 군림하는 것이 좋습니다!
SteveCinq 2017

5
var str = "PER 343573";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // "343573"
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "343573"

이것은 str. 지원하지 않는 대체 코드null 문자열을 . 첫 번째는 더 빠르고 두 번째는 더 콤팩트합니다.

알고 있다면 두 번째를 선호합니다 str포함하는 짧은 문자열을 합니다. 긴 문자열 인 경우 첫 번째 문자열이 더 적합합니다.

예 :

var str = "";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // ""
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // ""

또는

var str = "123";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty 
             : str.Length < 6 ? str 
             : str.Substring(str.Length - 6); // "123"
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "123"

1
나는 그 대안을 좋아합니다. 장황하지만 이해하기 쉽고 문자열이 너무 짧은 문제를 자동으로 처리합니다.
Andrew Grothe

3

이것을 사용하십시오 :

string mystr = "PER 343573"; int number = Convert.ToInt32(mystr.Replace("PER ",""));


3

언급되지 않은 또 다른 해결책

S.Substring(S.Length < 6 ? 0 : S.Length - 6)

3

널 안전 방법 :

원래 문자열을 반환하는 최대 길이보다 짧은 문자열

문자열 오른쪽 확장 방법

public static string Right(this string input, int count) =>
    String.Join("", (input + "").ToCharArray().Reverse().Take(count).Reverse());

문자열 왼쪽 확장 방법

public static string Left(this string input, int count) =>
    String.Join("", (input + "").ToCharArray().Take(count));

2

여기 내가 사용하는 해결책이 있습니다. 입력 문자열의 길이가 요청 된 길이보다 작지 않은지 확인합니다. 위에 게시 된 솔루션은 불행히도이를 고려하지 않아 충돌이 발생할 수 있습니다.

    /// <summary>
    /// Gets the last x-<paramref name="amount"/> of characters from the given string.
    /// If the given string's length is smaller than the requested <see cref="amount"/> the full string is returned.
    /// If the given <paramref name="amount"/> is negative, an empty string will be returned.
    /// </summary>
    /// <param name="string">The string from which to extract the last x-<paramref name="amount"/> of characters.</param>
    /// <param name="amount">The amount of characters to return.</param>
    /// <returns>The last x-<paramref name="amount"/> of characters from the given string.</returns>
    public static string GetLast(this string @string, int amount)
    {
        if (@string == null) {
            return @string;
        }

        if (amount < 0) {
            return String.Empty;
        }

        if (amount >= @string.Length) {
            return @string;
        } else {
            return @string.Substring(@string.Length - amount);
        }
    }

2

이것이 제가 사용하는 방법입니다. 저는 일을 단순하게 유지하는 것을 좋아합니다.

private string TakeLast(string input, int num)
{
    if (num > input.Length)
    {
        num = input.Length;
    }
    return input.Substring(input.Length - num);
}

1

그냥 생각 :

public static string Right(this string @this, int length) {
    return @this.Substring(Math.Max(@this.Length - length, 0));
}

1
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")

누군가 귀하의 게시물을 삭제 플래그로 지정 했고 검토 대기열에서 확인했습니다 . 게시물이 잘못 신고 된 것 같습니다. 코드 전용 답변은 품질이 낮지 않습니다 . 질문에 대한 답변을 시도합니까? 그렇지 않은 경우 플래그. 기술적으로 올바르지 않습니까? 반대 투표.
Wai Ha Lee

1
코드는 OP에서 문제를 해결하는 방법에 대한 서면 설명과 함께 제공되어야합니다.
Zze

1
글쎄요, 댓글에 적힌 설명이면 충분하다고 생각 했어요
vldmrrr

0

비트 변환기 및 비트 시프 팅 (인코딩 확인 필요)에 의존하지 않고 확장 방법 'Right'로 사용하는 가장 빠른 방법입니다.

string myString = "123456789123456789";

if (myString > 6)
{

        char[] cString = myString.ToCharArray();
        Array.Reverse(myString);
        Array.Resize(ref myString, 6);
        Array.Reverse(myString);
        string val = new string(myString);
}

2
Array.Reverse문자열이 아닌 배열을 취하고 if (myString.length > 6). 구문 오류를 제외하고 이것이 가장 빠른 방법 인 이유는 무엇입니까? 확실히 하위 문자열을 사용하는 것이 더 나은 방법 일 것입니다.이 모든 배열 복사가 필요하지는 않습니다.
1800 INFORMATION

0

Min을 사용하여 부정적인 상황을 방지하고 null 문자열도 처리합니다.

// <summary>
    /// Returns a string containing a specified number of characters from the right side of a string.
    /// </summary>
    public static string Right(this string value, int length)
    {
        string result = value;
        if (value != null)
            result = value.Substring(0, Math.Min(value.Length, length));
        return result;
    }

0
using Microsoft.visualBasic;

 public class test{
  public void main(){
   string randomString = "Random Word";
   print (Strings.right(randomString,4));
  }
 }

출력은 "Word"입니다.

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