substring
右端の6文字で構成されるを別のから抽出するにはどうすればよいstring
ですか?
例:文字列は"PER 343573"
です。今だけ抽出したいです"343573"
。
これどうやってするの?
string endOfString = Strings.Right(wholeString, 6);
substring
右端の6文字で構成されるを別のから抽出するにはどうすればよいstring
ですか?
例:文字列は"PER 343573"
です。今だけ抽出したいです"343573"
。
これどうやってするの?
string endOfString = Strings.Right(wholeString, 6);
回答:
string SubString = MyString.Substring(MyString.Length-6);
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;
}
sValue.Length > iMaxLength
部分文字列が呼び出される前とは異なります!
おそらく拡張メソッドを使う方がいいでしょう:
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);
str.Length - length
ネガティブである可能性があります。また、2番目のパラメーターはオプションです。長さを渡す必要はありません。
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)のように使用します。
文字列の長さがわからないが、単語数は確かである(この場合は常に「xxx yyyyyy」のように2単語)場合は、splitを使用することをお勧めします。
string Result = "PER 343573".Split(" ")[1];
これは常に文字列の2番目の単語を返します。
これは正確にあなたが求めているものではありませんが、例を見ると、文字列の数値セクションを探しているように見えます。
これが常に当てはまる場合は、正規表現を使用することをお勧めします。
var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;
あなたはすべてのコンパイル.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ファイルの解析に非常に役立つことがわかりました。
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"
ヌルセーフメソッド:
元の文字列を返す最大長より短い文字列
文字列右拡張メソッド
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));
これが私が使用する解決策です...入力文字列の長さが要求された長さより短くないことを確認します。上記で投稿した解決策は、残念ながらこれを考慮に入れていません-クラッシュにつながる可能性があります。
/// <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);
}
}
これは私が使用する方法です。物事をシンプルに保つのが好きです。
private string TakeLast(string input, int num)
{
if (num > input.Length)
{
num = input.Length;
}
return input.Substring(input.Length - num);
}
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
ビットコンバーターとビットシフト(エンコードを確実にする必要がある)に頼らずに、これは拡張メソッド「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);
}
Array.Reverse
文字列ではなく配列を取りますif (myString.length > 6)
。構文エラーはさておき、なぜこれが最速の方法なのでしょうか?確かに、部分文字列を使用するだけの方が良い方法です。このように配列をすべてコピーする必要はありません。
マイナスの状況を防ぐために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;
}
using Microsoft.visualBasic;
public class test{
public void main(){
string randomString = "Random Word";
print (Strings.right(randomString,4));
}
}
出力は「Word」です