Ekstrak hanya paling n huruf dari sebuah string

110

Bagaimana saya bisa mengekstrak substringyang terdiri dari enam huruf paling kanan dari yang lain string?

Contoh: string saya adalah "PER 343573". Sekarang saya hanya ingin mengekstrak "343573".

Bagaimana saya bisa melakukan ini?

Shyju
sumber
Anda dapat menggunakan kode sumber untuk metode VB.NET Right. Anda harus mengonversi ke C # terlebih dahulu: referenceource.microsoft.com/#Microsoft.VisualBasic/… Konversikan ke C # menggunakan converter.telerik.com
Darren Griffith
tetapi kode VB bergantung pada c # fungsi substring di strings.sc
Our Man in Bananas
Ini sebenarnya bukan cara yang baik untuk melakukannya, tetapi jika Anda dalam keadaan darurat, Anda dapat menambahkan referensi ke Microsoft.VisualBasic.dll, dan menggunakan metode yang Benar. Ini bukan metode ekstensi. Anda harus menggunakannya seperti ini:string endOfString = Strings.Right(wholeString, 6);
Alan McBee - MSFT

Jawaban:

156
string SubString = MyString.Substring(MyString.Length-6);
Vilx-
sumber
35
Pendekatan ini tidak bekerja dengan benar jika string tidak sepanjang jumlah karakter yang dibutuhkan.
stevehipwell
1
Bergantung pada apa yang diinginkan OP, seseorang mungkin juga melempar ekspresi reguler pada ini. Jika dia hanya menginginkan nomor di akhir string, itu pasti solusi yang paling tidak menyakitkan, terutama ketika jumlah digit dapat bervariasi dalam beberapa peningkatan perangkat lunak nanti.
Joey
2
@Johannes Rössel - Saya penggemar berat ekspresi reguler (lihat jawaban saya), tetapi saya tidak pernah merekomendasikan mereka untuk situasi sederhana seperti ini. Setiap jawaban yang menggunakan pembungkus fungsi lebih cocok untuk pemeliharaan kode daripada ekspresi reguler. Metode ekstensi (atau fungsi standar jika .NET 2.0) adalah solusi terbaik.
stevehipwell
@ Stevo3000 - memiliki solusi yang melempar jika string adalah panjang yang salah adalah solusi yang valid. Bukan satu-satunya solusi, tapi tetap saja.
Marc L.
3
@James - untuk menjadi seperti pernickity, hanya judul yang menyebutkan "huruf n". Pertanyaan sebenarnya yang diajukan meminta "enam huruf paling kanan" :)
Chris Rogers
69

Tulis metode ekstensi untuk mengekspresikan Right(n);fungsi tersebut. Fungsi ini harus menangani string kosong atau kosong yang mengembalikan string kosong, string lebih pendek dari panjang maksimal yang mengembalikan string asli dan string lebih panjang dari panjang maksimal yang mengembalikan panjang maksimal karakter paling kanan.

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;
}
stevehipwell.dll
sumber
Indeks awal juga tidak boleh kurang dari 0.
James
2
@James - Ini tidak akan seperti sValue.Length > iMaxLengthsebelum substring dipanggil!
stevehipwell
3
Jawaban yang bagus, tapi agak butuh waktu lama untuk melihat notasi Hongaria dalam kode C #.
Jerad Rose
1
@JeradRose - Saya bekerja dalam sebuah proyek di mana basis kode berevolusi dari aplikasi VB3 (sebagian besar adalah VB.NET) jadi ada beberapa sisa.
stevehipwell
4
@Jalle, VB.NET memiliki Kiri, Kanan dan Tengah sebagai fungsi tingkat atas, ditambah banyak hal bermanfaat lainnya yang bukan bagian dari C #. Tidak yakin mengapa, karena banyak dari mereka adalah fungsi yang layak.
ingredient_15939
40

Mungkin lebih baik menggunakan metode ekstensi:

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

Pemakaian

string myStr = "PER 343573";
string subStr = myStr.Right(6);
James
sumber
19
Maka itu akan melempar NullReferenceException seperti jika Anda mencoba menggunakan metode apa pun pada string nol ...
James
1
str.Length - lengthbisa menjadi negatif. Juga parameter kedua adalah opsional. Tidak perlu melewati panjangnya.
iheartcsharp
1
@ JMS10 pasti bisa tapi itu lebih perhatian penelepon daripada saya. Juga, ya poin yang adil, Anda dapat menggunakan override yang hanya mengambil satu parameter di sini.
Yakobus
str? .Substring (str.Length - length, 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
}

Seharusnya tidak error, mengembalikan null sebagai string kosong, mengembalikan nilai terpangkas atau dasar. Gunakan seperti "testx" .Left (4) atau str.Right (12);

Jeff Crawford
sumber
13

MSDN

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

EDIT: terlalu lambat ...

RvdK
sumber
9

jika Anda tidak yakin dengan panjang string Anda, tetapi Anda yakin jumlah kata (selalu 2 kata dalam kasus ini, seperti 'xxx yyyyyy') sebaiknya Anda menggunakan split.

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

ini selalu mengembalikan kata kedua dari string Anda.

Mahdi Tahsildari
sumber
Ya; anggap saja teks OP SELALU memiliki spasi; seperti dalam contohnya :)
Christian
1
Hei Christian :) kita semua tahu lebih dari beberapa baris jawaban. Saya baru saja menjawab pertanyaan itu secara singkat, tentu saja, ada lebih banyak hal yang perlu dipertimbangkan dalam kode nyata.
Mahdi Tahsildari
7

Ini tidak persis seperti yang Anda minta, tetapi hanya dengan melihat contohnya, tampaknya Anda sedang mencari bagian numerik dari string.

Jika ini selalu terjadi, cara yang baik untuk melakukannya adalah menggunakan ekspresi reguler.

var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;
menggigil 42
sumber
-1 ekspresi reguler agak berlebihan untuk sesuatu seperti ini, terutama bila sudah ada metode bawaan untuk melakukannya.
Yakobus
1
Saya tidak berdebat untuk menggunakan metode ini jika Anda benar-benar hanya membutuhkan 6 terakhir, tetapi jika tujuan Anda adalah mengekstrak angka (seperti id) yang dapat berubah menjadi 5 atau 7 digit di beberapa titik di masa depan, ini adalah cara yang lebih baik.
kedinginan 42
1
Jawaban lama, tetapi +1 untuk mendukung penggunaan ekspresi reguler. Terutama karena (masih) tidak ada metode bawaan dalam implementasi String .NET untuk melakukan @James ini. Jika tidak, pertanyaan ini mungkin tidak pernah ada.
CrazyIvan1974
@ CrazyIvan1974 tidak yakin mengapa Anda menyebut saya dalam komentar Anda
James
5

Gunakan ini:

String text = "PER 343573";
String numbers = text;
if (text.Length > 6)
{
    numbers = text.Substring(text.Length - 6);
}
cjk
sumber
teks? .Substring (teks. Panjang - 6)
Ludwo
5

Menebak kebutuhan Anda, tetapi ekspresi reguler berikut hanya akan menghasilkan 6 alfanumerik sebelum akhir string dan tidak ada kecocokan sebaliknya.

string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;
Menyeberang
sumber
Apakah solusi ini tidak memenuhi persyaratan yang tidak jelas? Jika tidak, jelaskan down voting Anda.
Wade
5

Karena Anda menggunakan .NET, yang semuanya dikompilasi ke MSIL , cukup referensikan Microsoft.VisualBasic , dan gunakan Strings.Rightmetode bawaan Microsoft :

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

Tidak perlu membuat metode ekstensi khusus atau pekerjaan lain. Hasilnya dicapai dengan satu referensi dan satu baris kode sederhana.

Sebagai info lebih lanjut tentang ini, menggunakan metode Visual Basic dengan C # telah didokumentasikan di tempat lain . Saya pribadi tersandung di atasnya pertama kali ketika mencoba untuk mengurai file, dan menemukan benang SO ini menggunakan Microsoft.VisualBasic.FileIO.TextFieldParserkelas menjadi sangat berguna untuk mem -parsing file .csv.

Aaron Thomas
sumber
Pendekatan ini juga dirinci dalam utas SO lainnya di sini: stackoverflow.com/a/15255454/2658159
Aaron Thomas
Itu MENTAL! Tapi sebagai VB guy, senang bisa menguasai CSharpers sekali!
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"

ini mendukung sejumlah karakter di str. kode alternatif tidak mendukungnull string. dan, yang pertama lebih cepat dan yang kedua lebih kompak.

Saya lebih suka yang kedua jika mengetahui str berisi string pendek. jika senar panjang, yang pertama lebih cocok.

misalnya

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

atau

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"
Supawat Pusavanno
sumber
1
Saya suka alternatif itu. Verbose, tetapi mudah dipahami dan menangani masalah string terlalu pendek secara otomatis.
Andrew Grothe
3

Gunakan ini:

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

Brandao
sumber
3

Solusi lain yang mungkin tidak disebutkan

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

Metode Aman Nol:

String yang lebih pendek dari panjang maksimal yang mengembalikan string asli

Metode Ekstensi String Kanan

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

Metode Ekstensi String Kiri

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

Inilah solusi yang saya gunakan ... Ini memeriksa bahwa panjang string input tidak lebih rendah dari panjang yang diminta. Sayangnya, solusi yang saya lihat diposting di atas tidak memperhitungkan hal ini - yang dapat menyebabkan crash.

    /// <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);
        }
    }
Yves Schelpe
sumber
2

Ini adalah metode yang saya gunakan: Saya suka membuat semuanya tetap sederhana.

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

Hanya pemikiran saja:

public static string Right(this string @this, int length) {
    return @this.Substring(Math.Max(@this.Length - length, 0));
}
Hamid Sadeghian
sumber
1
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
vldmrrr
sumber
Seseorang menandai postingan Anda untuk dihapus dan saya melihatnya dalam antrean tinjauan . Saya pikir posting Anda salah ditandai. Jawaban hanya kode tidak berkualitas rendah . Apakah itu mencoba menjawab pertanyaan? Jika tidak, tandai. Apakah secara teknis tidak benar? Suara negatif.
Wai Ha Lee
1
Kode harus disertai dengan penjelasan tertulis tentang bagaimana cara memperbaiki masalah di OP.
Zze
1
Yah, saya pikir penjelasan tertulis di komentar sudah cukup, bukan?
vldmrrr
0

Tanpa menggunakan bit converter dan bit shifting (perlu memastikan encoding) ini adalah metode tercepat yang saya gunakan sebagai metode ekstensi 'Benar'.

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);
}
CJM
sumber
2
Array.Reversemengambil array, bukan string, dan if (myString.length > 6). Selain kesalahan sintaks, mengapa ini menjadi metode tercepat? Tentunya hanya menggunakan substring akan menjadi cara yang lebih baik, itu tidak memerlukan semua penyalinan array ini.
1800 INFORMASI
0

Saya menggunakan Min untuk mencegah situasi negatif dan juga menangani string nol

// <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;
    }
RitchieD
sumber
0
using Microsoft.visualBasic;

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

keluarannya adalah "Word"

Steve Short
sumber