Extrahieren Sie nur ganz rechts n Buchstaben aus einer Zeichenfolge


110

Wie kann ich einen, substringder aus den sechs Buchstaben ganz rechts besteht, aus einem anderen extrahieren string?

Bsp.: Meine Zeichenfolge ist "PER 343573". Jetzt möchte ich nur extrahieren "343573".

Wie kann ich das machen?


Sie können den Quellcode für die VB.NET Right-Methode verwenden. Sie müssen zuerst in C # konvertieren : referencesource.microsoft.com/#Microsoft.VisualBasic/… Konvertieren in C # mit converter.telerik.com
Darren Griffith

Der VB-Code basiert jedoch auf der Funktion c # Teilzeichenfolge in strings.sc
Unser Mann in Bananen

Dies ist keine wirklich gute Möglichkeit, aber wenn Sie in einer Notlage sind, können Sie einen Verweis auf Microsoft.VisualBasic.dll hinzufügen und die richtige Methode verwenden. Es ist keine Erweiterungsmethode. Sie müssen es so verwenden:string endOfString = Strings.Right(wholeString, 6);
Alan McBee - MSFT

Antworten:


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

35
Dieser Ansatz funktioniert nicht richtig, wenn die Zeichenfolge nicht so lang ist wie die erforderliche Anzahl von Zeichen.
Stevehipwell

1
Je nachdem, was genau das OP will, kann man auch reguläre Ausdrücke darauf werfen. Wenn er nur die Nummer am Ende der Zeichenfolge haben möchte, ist dies definitiv die schmerzloseste Lösung, insbesondere wenn die Anzahl der Ziffern bei einem späteren Software-Upgrade variieren kann.
Joey

2
@Johannes Rössel - Ich bin ein großer Fan von regulären Ausdrücken (siehe meine Antworten), aber ich würde sie für eine einfache Situation wie diese niemals empfehlen. Alle Antworten, die einen Funktionsumbruch verwenden, eignen sich besser für die Codeverwaltung als ein regulärer Ausdruck. Eine Erweiterungsmethode (oder eine Standardfunktion in .NET 2.0) ist die beste Lösung.
Stevehipwell

@ Stevo3000 - Eine Lösung, die auslöst, wenn der String die falsche Länge hat, ist eine gültige Lösung. Nicht die einzige Lösung, aber dennoch.
Marc L.

3
@ James - um genauso pernickity zu sein, erwähnte nur der Titel "n Buchstaben". Die tatsächlich gestellte Frage lautete "die sechs Buchstaben ganz rechts" :)
Chris Rogers

69

Schreiben Sie eine Erweiterungsmethode, um die Right(n);Funktion auszudrücken . Die Funktion sollte sich mit null oder leeren Zeichenfolgen befassen, die eine leere Zeichenfolge zurückgeben, Zeichenfolgen, die kürzer als die maximale Länge der ursprünglichen Zeichenfolge sind, und Zeichenfolgen, die länger als die maximale Länge sind und die maximale Länge der Zeichen ganz rechts zurückgeben.

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

Der Startindex darf auch nicht kleiner als 0 sein.
James

2
@ James - Es wird nicht so sein, wie sValue.Length > iMaxLengthbevor ein Teilstring aufgerufen wird!
Stevehipwell

3
Tolle Antwort, aber es war eine doppelte Sache, die ungarische Notation im C # -Code zu sehen.
Jerad Rose

1
@ JeradRose - Ich arbeite in einem Projekt, in dem sich die Codebasis aus einer VB3-Anwendung entwickelt hat (das meiste davon ist VB.NET), daher gibt es einige Überreste.
Stevehipwell

4
@Jalle, VB.NET hat Links, Rechts und Mittel als Funktionen der obersten Ebene sowie viele andere hilfreiche Dinge, die nicht Teil von C # sind. Ich weiß nicht warum, da viele von ihnen anständige Funktionen sind.
ingredient_15939

40

Wahrscheinlich ist es besser, eine Erweiterungsmethode zu verwenden:

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

Verwendung

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

19
Dann würde es eine NullReferenceException auslösen, genau wie wenn Sie versuchen würden, eine Methode für eine Nullzeichenfolge zu verwenden ...
James

1
str.Length - lengthkönnte negativ sein. Auch der zweite Parameter ist optional. Keine Notwendigkeit, die Länge zu übergeben.
Iheartcsharp

1
@ JMS10 könnte es sicherlich sein, aber das ist mehr die Anrufer als meine. Ja, fairerweise können Sie auch die Überschreibung verwenden, die hier nur den einzelnen Parameter verwendet.
James

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

Sollte kein Fehler auftreten, werden Nullen als leere Zeichenfolge zurückgegeben, zugeschnittene Werte oder Basiswerte zurückgegeben. Verwenden Sie es wie "testx" .Left (4) oder str.Right (12);


13

MSDN

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

EDIT: zu langsam ...


9

Wenn Sie sich über die Länge Ihrer Zeichenfolge nicht sicher sind, aber über die Anzahl der Wörter (in diesem Fall immer 2 Wörter, z. B. 'xxx yyyyyy'), sollten Sie split verwenden.

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

Dies gibt immer das zweite Wort Ihrer Zeichenfolge zurück.


Ja; Nehmen wir einfach an, dass der Text von OP IMMER Leerzeichen enthält. wie in seinem Beispiel :)
Christian

1
Hei Christian :) Wir alle kennen mehr als ein paar Zeilen einer Antwort. Ich habe die Frage nur kurz beantwortet, natürlich gibt es in echtem Code noch viel mehr zu beachten.
Mahdi Tahsildari

7

Dies ist nicht genau das, wonach Sie fragen, aber wenn Sie sich nur das Beispiel ansehen, scheint es, dass Sie nach dem numerischen Abschnitt der Zeichenfolge suchen.

Wenn dies immer der Fall ist, ist die Verwendung eines regulären Ausdrucks ein guter Weg, dies zu tun.

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

-1 reguläre Ausdrücke sind für so etwas ein wenig übertrieben, besonders wenn es bereits eingebaute Methoden dafür gibt.
James

1
Ich plädiere nicht für die Verwendung dieser Methode, wenn Sie wirklich nur die letzten 6 benötigen, aber wenn Ihr Ziel darin besteht, eine Zahl (z. B. eine ID) zu extrahieren, die sich zu einem späteren Zeitpunkt auf 5 oder 7 Stellen ändern kann ist ein besserer Weg.
Chills42

1
Alte Antwort, aber +1, um die Verwendung regulärer Ausdrücke zu unterstützen. Zumal es in der .NET-String-Implementierung (noch) keine integrierten Methoden gibt, um dies zu tun @James. Andernfalls hätte diese Frage möglicherweise nie existiert.
CrazyIvan1974

@ CrazyIvan1974 nicht sicher, warum Sie mich in Ihrem Kommentar erwähnt haben
James

5

Benutze das:

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

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

5

Das Erraten Ihrer Anforderungen, aber der folgende reguläre Ausdruck ergibt nur 6 alphanumerische Zeichen vor dem Ende der Zeichenfolge und ansonsten keine Übereinstimmung.

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

Entspricht diese Lösung den vagen Anforderungen nicht angemessen? Wenn nicht, erläutern Sie bitte Ihre Ablehnung.
Wade

5

Da Sie .NET verwenden, das alle in MSIL kompiliert wird , verweisen Sie einfach auf Microsoft.VisualBasic und verwenden Sie die integrierte Strings.RightMethode von Microsoft :

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

Sie müssen keine benutzerdefinierte Erweiterungsmethode oder andere Arbeit erstellen. Das Ergebnis wird mit einer Referenz und einer einfachen Codezeile erzielt.

Als weitere Informationen hierzu wurde die Verwendung von Visual Basic-Methoden mit C # an anderer Stelle dokumentiert . Ich persönlich bin zuerst darauf gestoßen, als ich versucht habe, eine Datei zu analysieren, und fand diesen SO-Thread bei der Verwendung der Microsoft.VisualBasic.FileIO.TextFieldParserKlasse äußerst nützlich für das Parsen von CSV-Dateien.


Dieser Ansatz wurde auch in einem anderen SO-Thread hier detailliert beschrieben: stackoverflow.com/a/15255454/2658159
Aaron Thomas

Das ist MENTAL! Aber als VB-Typ ist es schön, einmal über die CSharpers zu herrschen!
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"

Dies unterstützt eine beliebige Anzahl von Zeichen in der str. Der alternative Code unterstützt keine nullZeichenfolge. und der erste ist schneller und der zweite ist kompakter.

Ich bevorzuge die zweite, wenn ich die strenthaltende kurze Zeichenfolge kenne. Wenn es sich um eine lange Saite handelt, ist die erste besser geeignet.

z.B

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

oder

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
Ich mag diese Alternative. Ausführlich, aber leicht zu verstehen und behandelt das Problem mit zu kurzen Zeichenfolgen automatisch.
Andrew Grothe

3

Benutze das:

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


3

Eine andere Lösung, die möglicherweise nicht erwähnt wird

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

3

Null sichere Methoden:

Zeichenfolgen, die kürzer als die maximale Länge sind und die ursprüngliche Zeichenfolge zurückgeben

String Right Extension-Methode

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

String Left Extension-Methode

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

2

Hier ist die Lösung, die ich verwende ... Sie überprüft, ob die Länge der Eingabezeichenfolge nicht geringer als die angeforderte Länge ist. Die oben aufgeführten Lösungen berücksichtigen dies leider nicht - was zu Abstürzen führen kann.

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

Dies ist die Methode, die ich verwende: Ich mag es, die Dinge einfach zu halten.

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

1

Nur ein Gedanke:

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

Jemand hat Ihren Beitrag zum Löschen markiert, und ich habe ihn in einer Überprüfungswarteschlange gesehen . Ich denke, Ihr Beitrag wurde falsch markiert. Nur-Code-Antworten sind nicht von geringer Qualität . Versucht es, die Frage zu beantworten? Wenn nicht, markieren Sie. Ist es technisch falsch? Downvote.
Wai Ha Lee

1
Dem Code sollte eine schriftliche Erklärung beigefügt werden, wie das Problem im OP behoben wird.
Zze

1
Nun, ich dachte, eine schriftliche Erklärung in Kommentaren wäre ausreichend, nein?
Vldmrrr

0

Ohne auf den Bitkonverter und die Bitverschiebung zurückzugreifen (muss auf Codierung achten), ist dies die schnellste Methode, die ich als Erweiterungsmethode 'Richtig' verwende.

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.Reversenimmt ein Array, keine Zeichenfolge, und if (myString.length > 6). Abgesehen von Syntaxfehlern, warum sollte dies die schnellste Methode sein? Sicherlich wäre es besser, nur Teilzeichenfolgen zu verwenden, da all diese Arrays nicht kopiert werden müssten.
1800 INFORMATION

0

Ich benutze das Min, um die negativen Situationen zu verhindern und auch Nullzeichenfolgen zu behandeln

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

Ausgabe ist "Word"

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.