Bir dizeden yalnızca en sağdaki n harfi çıkar


110

substringDiğerinden en sağdaki altı harften oluşan a'yı nasıl çıkarabilirim string?

Ör: benim dizem "PER 343573". Şimdi sadece çıkarmak istiyorum "343573".

Bunu nasıl yapabilirim?


VB.NET Right yöntemi için kaynak kodunu kullanabilirsiniz. Önce C # biçimine dönüştürmeniz gerekir : referenceource.microsoft.com/#Microsoft.VisualBasic/… converter.telerik.com'u
Darren Griffith

ancak VB kodu, strings.sc'deki c # Substring işlevine dayanır
Our Man in Bananas

Bu, bunu yapmanın pek iyi bir yolu değildir, ancak zor durumdaysanız, Microsoft.VisualBasic.dll'ye bir başvuru ekleyebilir ve Right yöntemini kullanabilirsiniz. Bir uzatma yöntemi değildir. Bunu şu şekilde kullanmalısın:string endOfString = Strings.Right(wholeString, 6);
Alan McBee - MSFT

Yanıtlar:


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

35
Dize, gereken karakter sayısı kadar uzun değilse bu yaklaşım doğru çalışmaz.
stevehipwell

1
OP'nin tam olarak ne istediğine bağlı olarak, buna düzenli ifadeler de atılabilir. Yalnızca dizenin sonundaki sayıyı istiyorsa, bu kesinlikle en zahmetsiz çözümdür, özellikle de daha sonraki bazı yazılım yükseltmelerinde basamak sayısı değiştiğinde.
Joey

2
@Johannes Rössel - Düzenli ifadelerin büyük bir hayranıyım (cevaplarıma bakın), ancak böyle basit bir durum için onları asla tavsiye etmem. Bir işlev sarmalayıcısı kullanan yanıtlardan herhangi biri, kod bakımı için normal bir ifadeden daha uygundur. Bir uzantı yöntemi (veya .NET 2.0 ise standart işlev) en iyi çözümdür.
stevehipwell

@ Stevo3000 - dizge yanlış uzunluktaysa atan bir çözüme sahip olmak geçerli bir çözümdür. Tek çözüm değil, yine de.
Marc L.

3
@James - pernickity gibi, sadece başlıkta "n harf" geçiyordu. Sorulan asıl soru "en sağdaki altı harf" için soruldu :)
Chris Rogers

69

Right(n);İşlevi ifade etmek için bir uzatma yöntemi yazın . İşlev, boş bir dize döndüren boş veya boş dizelerle, orijinal dizeyi döndüren maksimum uzunluktan daha kısa dizelerle ve en sağdaki karakterlerin maksimum uzunluğunu döndüren maksimum uzunluktan daha uzun dizelerle ilgilenmelidir.

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

Başlangıç ​​dizini de 0'dan küçük olamaz.
James

2
@James - sValue.Length > iMaxLengthBir alt dize çağrılmadan önceki gibi olmayacak !
stevehipwell

3
Harika yanıt, ancak Macar gösterimini C # kodunda görmek biraz iki kez yapıldı.
Jerad Rose

1
@JeradRose - Kod tabanının bir VB3 uygulamasından geliştiği bir projede çalışıyorum (bunun çoğu VB.NET), bu yüzden bazı kalıntılar var.
stevehipwell

4
@Jalle, VB.NET üst düzey işlevler olarak Sol, Sağ ve Orta, artı C # 'ın parçası olmayan diğer birçok yardımcı şeye sahiptir. Birçoğu düzgün işlevler olduğu için neden olduğundan emin değilim.
ingredient_15939

40

Bir uzatma yöntemi kullanmak muhtemelen daha hoş:

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

kullanım

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

19
Ardından, boş bir dizede herhangi bir yöntemi kullanmaya çalıştığınızda yapacağı gibi bir NullReferenceException atar ...
James

1
str.Length - lengthnegatif olabilir. Ayrıca ikinci parametre isteğe bağlıdır. Uzunluğu geçmeye gerek yok.
iheartcsharp

1
@ JMS10 kesinlikle olabilir ama arayanlar benimkinden daha fazla endişeleniyor. Ayrıca, evet doğru nokta, burada sadece tek parametreyi alan geçersiz kılmayı kullanabilirsiniz.
James

str? .Substring (str.Length - uzunluk, uzunluk);
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
}

Hata olmamalı, boş dizge olarak null döndürür, kesilmiş veya temel değerleri döndürür. "Testx" .Left (4) veya str.Right (12) gibi kullanın;


13

MSDN

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

DÜZENLEME: çok yavaş ...


9

dizenizin uzunluğundan emin değilseniz, ancak kelimelerin sayıldığından eminseniz (bu durumda her zaman 2 kelime, 'xxx yyyyyy' gibi) bölmeyi kullansanız iyi olur.

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

bu her zaman dizenizin ikinci kelimesini döndürür.


Evet; OP'nin metninin HER ZAMAN beyaz boşluklara sahip olduğunu varsayalım; örneğindeki gibi :)
Christian

1
Hei Christian :) Hepimiz bir cevaptan birkaç satırdan fazlasını biliyoruz. Sadece soruyu kısaca cevapladım, tabii ki gerçek kodda dikkate alınması gereken daha çok şey var.
Mehdi Tahsildari

7

Bu tam olarak istediğiniz şey değil, ancak sadece örneğe bakınca, dizenin sayısal bölümünü aradığınız anlaşılıyor.

Bu her zaman böyleyse, bunu yapmanın iyi bir yolu düzenli ifade kullanmaktır.

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

-1 normal ifade, bunun gibi bir şey için biraz aşırıdır, özellikle bunu yapmak için zaten yerleşik yöntemler varsa.
James

1
Gerçekten yalnızca son 6'ya ihtiyacınız varsa, bu yöntemi kullanmayı tartışmıyorum, ancak amacınız gelecekte bir noktada 5 veya 7 haneye değişebilecek bir sayı (kimlik gibi) çıkarmaksa, bu daha iyi bir yoldur.
chills42

1
Eski yanıt, ancak normal ifadelerin kullanımını desteklemek için +1. Özellikle .NET'in String uygulamasında bunu @ James yapmak için yerleşik yöntemler olmadığından (hala). Aksi takdirde, bu soru hiç var olmayabilir.
CrazyIvan1974

@ CrazyIvan1974 yorumunuzda neden benden bahsettiğinizden emin değilim
James

5

Bunu kullan:

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

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

5

Gereksinimlerinizi tahmin etmek, ancak aşağıdaki normal ifade, dizenin sonundan önce yalnızca 6 alfanümerik sonuç verir ve aksi takdirde eşleşme olmaz.

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

Bu çözüm belirsiz gereksinimleri makul bir şekilde karşılamıyor mu? Değilse, lütfen olumsuz oyunuzu açıklayın.
Wade

5

Eğer tüm derler .NET, kullandığımız için MSIL , sadece referans Microsoft.VisualBasic ve kullanmak Microsoft'un yerleşik Strings.Rightyöntemiyle :

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

Özel bir uzatma yöntemi veya başka bir çalışma oluşturmanıza gerek yok. Sonuç, bir referans ve tek bir basit kod satırı ile elde edilir.

Bununla ilgili daha fazla bilgi olarak, C # ile Visual Basic yöntemlerinin kullanılması başka yerlerde belgelenmiştir . Ben şahsen bir dosyayı ayrıştırmaya çalışırken ilk önce tökezledim ve bu SO iş parçacığınınMicrosoft.VisualBasic.FileIO.TextFieldParser sınıfı kullanarak .csv dosyalarını ayrıştırmak için son derece yararlı olduğunu gördüm.


Bu yaklaşım, burada başka bir SO başlığında da ayrıntılı olarak açıklanmıştır: stackoverflow.com/a/15255454/2658159
Aaron Thomas

ZİHİNSEL! Ama bir VB adamı olarak, bir kez olsun CSharpers'a hükmetmek güzel!
SteveCinq

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"

bu str,. alternatif kod nulldizeyi desteklemez . ve birincisi daha hızlı ve ikincisi daha kompakt.

strİçeren kısa diziyi biliyorsanız ikincisini tercih ederim . uzun bir ip ise ilki daha uygundur.

Örneğin

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()); // ""

veya

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
Bu alternatifi beğendim. Ayrıntılı, ancak anlaşılması kolay ve çok kısa diziyi otomatik olarak ele alıyor.
Andrew Grothe

3

Bunu kullan:

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


3

Bahsedilemeyecek başka bir çözüm

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

3

Boş Güvenli Yöntemler:

Orijinal dizeyi döndüren maksimum uzunluktan daha kısa dizeler

Dize Sağ Uzantı Yöntemi

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

Dize Sol Uzantı Yöntemi

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

2

İşte kullandığım çözüm ... Girdi dizesinin uzunluğunun istenen uzunluktan düşük olmadığını kontrol ediyor. Yukarıda gördüğüm çözümler maalesef bunu dikkate almıyor - bu da çökmelere neden olabilir.

    /// <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

Kullandığım yöntem bu: İşleri basit tutmayı seviyorum.

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

1

Sadece bir düşünce:

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")

Biri yayınınızı silinmek üzere işaretledi ve ben onu bir inceleme kuyruğunda gördüm . Gönderinizin yanlış işaretlendiğini düşünüyorum. Yalnızca kod yanıtları düşük kaliteli değildir . Soruyu cevaplamaya çalışıyor mu? Değilse, bayrak. Teknik olarak yanlış mı? Downvote.
Wai Ha Lee

1
Kod, OP'de sorunu nasıl çözdüğüne dair yazılı bir açıklama ile birlikte verilmelidir.
Zze

1
Yorumlarda yazılı açıklamanın yeterli olduğunu düşündüm, değil mi?
vldmrrr

0

Bit dönüştürücüye ve bit kaydırmaya başvurmadan (kodlamadan emin olmak gerekir) bu, 'Sağ' genişletme yöntemi olarak kullandığım en hızlı yöntemdir.

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.Reversebir dizi değil, bir dizi alır ve if (myString.length > 6). Sözdizimi hataları bir yana, bu neden en hızlı yöntem olsun? Elbette sadece alt dizeyi kullanmak daha iyi bir yol olurdu, dizilerin tüm bu kopyalanmasını gerektirmez.
1800 BİLGİ

0

Negatif durumları önlemek ve aynı zamanda boş dizeleri işlemek için Min'i kullanıyorum

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

çıktı "Word" dür

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.