文字列から最も右側のn文字だけを抽出する


110

substring右端の6文字で構成されるを別のから抽出するにはどうすればよいstringですか?

例:文字列は"PER 343573"です。今だけ抽出したいです"343573"

これどうやってするの?


VB.NET Rightメソッドのソースコードを使用できます。最初にC#に変換する必要があります:referencesource.microsoft.com/#Microsoft.VisualBasic/…converter.telerik.comを使用してC#に変換します
Darren Griffith

しかし、VBコードは、strings.scのc#サブストリング関数に依存しています
バナナの私たちの男

これは実際には非常に良い方法ではありませんが、問題が発生した場合は、Microsoft.VisualBasic.dllへの参照を追加して、Rightメソッドを使用できます。拡張方法ではありません。:あなたはこのようにそれを使用する必要がありますstring endOfString = Strings.Right(wholeString, 6);
MSFT -アラン・マクビー

回答:


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

35
文字列が必要な文字数に満たない場合、このアプローチは正しく機能しません。
stevehipwell 2009年

1
OPが正確に何を望んでいるかに応じて、正規表現をスローすることもできます。文字列の最後の数字だけが必要な場合は、特にソフトウェアのアップグレードによって桁数が異なる場合は、これが間違いなく最も簡単な解決策です。
Joey、

2
@JohannesRössel-私は正規表現の大ファンです(私の回答を参照してください)が、このような単純な状況では推奨しません。関数ラッパーを使用する回答は、正規表現よりもコードの保守に適しています。拡張メソッド(.NET 2.0の場合は標準関数)が最適なソリューションです。
stevehipwell 2009年

@ Stevo3000-文字列の長さが正しくない場合にスローするソリューションがあることは有効なソリューションです。唯一の解決策ではありませんが、それでもなおです。
マークL.

3
@ジェームズ-同じく厄介であるように、タイトルだけが「n文字」と言及しました。提起された実際の質問は、「右端の6文字」を要求するものでした:)
Chris Rogers

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未満にすることはできません。
ジェームズ

2
@ジェームズ- 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
次に、Null文字列に対してメソッドを使用しようとした場合と同様に、NullReferenceExceptionをスローします...
James

1
str.Length - lengthネガティブである可能性があります。また、2番目のパラメーターはオプションです。長さを渡す必要はありません。
iheartcsharp

1
@ JMS10それは確かにあり得ますが、それは私のよりも発信者が懸念していることです。また、はい、公平な点です。ここでは、単一のパラメーターを受け取るだけのオーバーライドを使用できます。
ジェームズ

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

これは常に文字列の2番目の単語を返します。


うん。OPのテキストに常に空白があると仮定しましょう。彼の例のように:)
クリスチャン

1
Hei Christian :)私たちは皆、数行以上の答えを知っています。もちろん、質問に簡潔に答えただけです。もちろん、実際のコードでは、さらに多くの考慮事項があります。
Mahdi Tahsildari

7

これは正確にあなたが求めているものではありませんが、例を見ると、文字列の数値セクションを探しているように見えます。

これが常に当てはまる場合は、正規表現を使用することをお勧めします。

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

-1正規表現は、特に組み込みのメソッドが既に存在する場合は特に、このようなことには少しやりすぎです。
ジェームズ

1
最後の6つだけが本当に必要な場合にこの方法を使用することについては主張しませんが、将来的に5桁または7桁に変わる可能性のある数値(IDなど)を抽出することが目的の場合、これはより良い方法です。
chills42 2009年

1
古い答えですが、正規表現の使用をサポートするための+1。特に、これを行うための.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;

このソリューションは、あいまいな要件を合理的に満たしていませんか?そうでない場合は、あなたの反対投票について説明してください。
ウェイド、

5

あなたはすべてのコンパイル.NET、使用しているのでMSIL、ちょうど参照Microsoft.VisualBasicを、そしてマイクロソフトの組み込みの使用Strings.Right方法を

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

カスタム拡張メソッドやその他の作業を作成する必要はありません。結果は、1つの参照と1つの単純なコード行で達成されます。

これに関する詳細情報として、C#でのVisual Basicメソッドの使用については、他の場所で文書化さています。私が個人的にファイルを解析しようとしたときに最初につまずいたので、このSOスレッドMicrosoft.VisualBasic.FileIO.TextFieldParserクラスの使用時に.csvファイルの解析に非常に役立つことがわかりました。


このアプローチは、こちらの別のSOスレッドでも詳しく説明されています:stackoverflow.com/a/15255454/2658159
Aaron Thomas

それはメンタルです!しかし、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文字列をサポートしていません。そして、1つ目はより速く、2つ目はよりコンパクトです。

str含まれている短い文字列を知っている場合は、2番目の方を好みます。長い文字列の場合、最初の文字列の方が適しています。

例えば

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 2018

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情報

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.