C# Language
共通文字列操作
サーチ…
特定の文字で文字列を分割する
string helloWorld = "hello world, how is it going?";
string[] parts1 = helloWorld.Split(',');
//parts1: ["hello world", " how is it going?"]
string[] parts2 = helloWorld.Split(' ');
//parts2: ["hello", "world,", "how", "is", "it", "going?"]
指定された文字列の部分文字列の取得
string helloWorld = "Hello World!";
string world = helloWorld.Substring(6); //world = "World!"
string hello = helloWorld.Substring(0,5); // hello = "Hello"
Substring
ストリングは、指定されたインデックスから、または2つのインデックス間(両方を含む)の文字Substring
返します。
文字列が指定されたシーケンスで始まるかどうかを判断する
string HelloWorld = "Hello World";
HelloWorld.StartsWith("Hello"); // true
HelloWorld.StartsWith("Foo"); // false
文字列内の文字列を見つける
System.String.Contains
を使用すると、特定の文字列が文字列内に存在するかどうかを調べることができます。このメソッドはbooleanを返します。文字列が存在する場合はtrueを返し、そうでない場合はfalseを返します。
string s = "Hello World";
bool stringExists = s.Contains("ello"); //stringExists =true as the string contains the substring
文字列の開始および/または終了の不要な文字のトリミング。
String.Trim()
string x = " Hello World! ";
string y = x.Trim(); // "Hello World!"
string q = "{(Hi!*";
string r = q.Trim( '(', '*', '{' ); // "Hi!"
String.TrimStart()
およびString.TrimEnd()
string q = "{(Hi*";
string r = q.TrimStart( '{' ); // "(Hi*"
string s = q.TrimEnd( '*' ); // "{(Hi"
文字列の書式設定
String.Format()
メソッドを使用して、文字列内の1つ以上の項目を指定されたオブジェクトの文字列表現に置き換えます。
String.Format("Hello {0} Foo {1}", "World", "Bar") //Hello World Foo Bar
文字列の配列を新しい配列に結合する
var parts = new[] { "Foo", "Bar", "Fizz", "Buzz"};
var joined = string.Join(", ", parts);
//joined = "Foo, Bar, Fizz, Buzz"
文字列を固定長にパディングする
string s = "Foo";
string paddedLeft = s.PadLeft(5); // paddedLeft = " Foo" (pads with spaces by default)
string paddedRight = s.PadRight(6, '+'); // paddedRight = "Foo+++"
string noPadded = s.PadLeft(2); // noPadded = "Foo" (original string is never shortened)
配列から文字列を構築する
String.Join
メソッドは、文字列または文字列の配列から文字列を作成するのに役立ちます。このメソッドは2つのパラメータを受け入れます。最初のものは、配列の各要素を区切るのに役立つデリミタまたはセパレータです。 2番目のパラメータは配列そのものです。
char array
からのchar array
:
string delimiter=",";
char[] charArray = new[] { 'a', 'b', 'c' };
string inputString = String.Join(delimiter, charArray);
出力 : a,b,c
delimiter
を""
変更すると、出力はabc
ます。
List of char
からの文字列:
string delimiter = "|";
List<char> charList = new List<char>() { 'a', 'b', 'c' };
string inputString = String.Join(delimiter, charList);
出力 : a|b|c
文字列のList of Strings
からの文字列:
string delimiter = " ";
List<string> stringList = new List<string>() { "Ram", "is", "a","boy" };
string inputString = String.Join(delimiter, stringList);
出力 : Ram is a boy
文字列のarray of strings
:
string delimiter = "_";
string[] stringArray = new [] { "Ram", "is", "a","boy" };
string inputString = String.Join(delimiter, stringArray);
出力 : Ram_is_a_boy
ToStringを使用した書式設定
通常、フォーマットの目的でString.Format
メソッドを使用していますが、 .ToString
は通常、他のタイプを文字列に変換するために使用されます。変換が行われている間にToStringメソッドと共にフォーマットを指定することができるので、追加のフォーマットを避けることができます。さまざまなタイプでどのように動作するかを説明しましょう。
整数から書式付き文字列へ:
int intValue = 10;
string zeroPaddedInteger = intValue.ToString("000"); // Output will be "010"
string customFormat = intValue.ToString("Input value is 0"); // output will be "Input value is 10"
フォーマットされた文字列に二重:
double doubleValue = 10.456;
string roundedDouble = doubleValue.ToString("0.00"); // output 10.46
string integerPart = doubleValue.ToString("00"); // output 10
string customFormat = doubleValue.ToString("Input value is 0.0"); // Input value is 10.5
ToStringを使用したDateTimeの書式設定
DateTime currentDate = DateTime.Now; // {7/21/2016 7:23:15 PM}
string dateTimeString = currentDate.ToString("dd-MM-yyyy HH:mm:ss"); // "21-07-2016 19:23:15"
string dateOnlyString = currentDate.ToString("dd-MM-yyyy"); // "21-07-2016"
string dateWithMonthInWords = currentDate.ToString("dd-MMMM-yyyy HH:mm:ss"); // "21-July-2016 19:23:15"
文字列の右側からx文字を取得する
Visual Basicには、文字列の左、右、および中央からの文字を返すLeft、Right、およびMid関数があります。これらのメソッドはC#では存在しませんが、 Substring()
実装できます。これらは、次のような拡張メソッドとして実装できます。
public static class StringExtensions
{
/// <summary>
/// VB Left function
/// </summary>
/// <param name="stringparam"></param>
/// <param name="numchars"></param>
/// <returns>Left-most numchars characters</returns>
public static string Left( this string stringparam, int numchars )
{
// Handle possible Null or numeric stringparam being passed
stringparam += string.Empty;
// Handle possible negative numchars being passed
numchars = Math.Abs( numchars );
// Validate numchars parameter
if (numchars > stringparam.Length)
numchars = stringparam.Length;
return stringparam.Substring( 0, numchars );
}
/// <summary>
/// VB Right function
/// </summary>
/// <param name="stringparam"></param>
/// <param name="numchars"></param>
/// <returns>Right-most numchars characters</returns>
public static string Right( this string stringparam, int numchars )
{
// Handle possible Null or numeric stringparam being passed
stringparam += string.Empty;
// Handle possible negative numchars being passed
numchars = Math.Abs( numchars );
// Validate numchars parameter
if (numchars > stringparam.Length)
numchars = stringparam.Length;
return stringparam.Substring( stringparam.Length - numchars );
}
/// <summary>
/// VB Mid function - to end of string
/// </summary>
/// <param name="stringparam"></param>
/// <param name="startIndex">VB-Style startindex, 1st char startindex = 1</param>
/// <returns>Balance of string beginning at startindex character</returns>
public static string Mid( this string stringparam, int startindex )
{
// Handle possible Null or numeric stringparam being passed
stringparam += string.Empty;
// Handle possible negative startindex being passed
startindex = Math.Abs( startindex );
// Validate numchars parameter
if (startindex > stringparam.Length)
startindex = stringparam.Length;
// C# strings are zero-based, convert passed startindex
return stringparam.Substring( startindex - 1 );
}
/// <summary>
/// VB Mid function - for number of characters
/// </summary>
/// <param name="stringparam"></param>
/// <param name="startIndex">VB-Style startindex, 1st char startindex = 1</param>
/// <param name="numchars">number of characters to return</param>
/// <returns>Balance of string beginning at startindex character</returns>
public static string Mid( this string stringparam, int startindex, int numchars)
{
// Handle possible Null or numeric stringparam being passed
stringparam += string.Empty;
// Handle possible negative startindex being passed
startindex = Math.Abs( startindex );
// Handle possible negative numchars being passed
numchars = Math.Abs( numchars );
// Validate numchars parameter
if (startindex > stringparam.Length)
startindex = stringparam.Length;
// C# strings are zero-based, convert passed startindex
return stringparam.Substring( startindex - 1, numchars );
}
}
この拡張メソッドは、次のように使用できます。
string myLongString = "Hello World!";
string myShortString = myLongString.Right(6); // "World!"
string myLeftString = myLongString.Left(5); // "Hello"
string myMidString1 = myLongString.Left(4); // "lo World"
string myMidString2 = myLongString.Left(2,3); // "ell"
String.IsNullOrEmpty()およびString.IsNullOrWhiteSpace()を使用して空のStringをチェックしています。
string nullString = null;
string emptyString = "";
string whitespaceString = " ";
string tabString = "\t";
string newlineString = "\n";
string nonEmptyString = "abc123";
bool result;
result = String.IsNullOrEmpty(nullString); // true
result = String.IsNullOrEmpty(emptyString); // true
result = String.IsNullOrEmpty(whitespaceString); // false
result = String.IsNullOrEmpty(tabString); // false
result = String.IsNullOrEmpty(newlineString); // false
result = String.IsNullOrEmpty(nonEmptyString); // false
result = String.IsNullOrWhiteSpace(nullString); // true
result = String.IsNullOrWhiteSpace(emptyString); // true
result = String.IsNullOrWhiteSpace(tabString); // true
result = String.IsNullOrWhiteSpace(newlineString); // true
result = String.IsNullOrWhiteSpace(whitespaceString); // true
result = String.IsNullOrWhiteSpace(nonEmptyString); // false
特定のインデックスでの文字の取得と文字列の列挙
Substring
ストリングメソッドを使用して、指定された場所の文字列から任意の数の文字を取得できます。ただし、文字を1つしか必要としない場合は、文字列インデクサを使用して、配列のように任意のインデックスで1文字を取得できます。
string s = "hello";
char c = s[1]; //Returns 'e'
string
型を返すSubstring
メソッドとは異なり、戻り値の型はchar
であることに注意してください。
インデクサを使用して、文字列の文字を繰り返し処理することもできます。
string s = "hello";
foreach (char c in s)
Console.WriteLine(c);
/********* This will print each character on a new line:
h
e
l
l
o
**********/
10進数を2進、8進、16進の形式に変換する
10進数をバイナリ形式に変換するには、 基数2を使用します。
Int32 Number = 15; Console.WriteLine(Convert.ToString(Number, 2)); //OUTPUT : 1111
10進数を8進形式に変換するには、 基数8を使用します。
int Number = 15; Console.WriteLine(Convert.ToString(Number, 8)); //OUTPUT : 17
10進数を16進数形式に変換するには、 base 16
var Number = 15; Console.WriteLine(Convert.ToString(Number, 16)); //OUTPUT : f
別の文字列で文字列を分割する
string str = "this--is--a--complete--sentence";
string[] tokens = str.Split(new[] { "--" }, StringSplitOptions.None);
結果:
["this"、 "is"、 "a"、 "complete"、 "sentence"]
文字列を正しく逆転させる
人々が文字列を逆にしなければならないほとんどの場合、多かれ少なかれ次のようになります。
char[] a = s.ToCharArray();
System.Array.Reverse(a);
string r = new string(a);
しかし、これらの人々が認識していないことは、これが実際には間違っているということです。
そして、私はヌルチェックがないために意味しません。
Glyph / GraphemeClusterはいくつかのコードポイント(別名:文字)で構成できるため、実際には間違っています。
これがなぜそうであるかを見るためには、最初に「文字」という言葉が実際に意味するものを認識しなければなりません。
キャラクターは、多くのことを意味することができる過負荷の言葉です。
コードポイントは、情報の原子単位です。テキストはコードポイントのシーケンスです。各コードポイントは、Unicode標準によって意味付けられた数字です。
書記素は、読者が書記体系の単一の要素として認識する単一のグラフィカル単位として表示される1つ以上のコードポイントのシーケンスです。例えば、aとäはともにグラフェンですが、複数のコードポイントで構成されていてもかまいません(例えば、äは2つのコードポイント、1つは基本キャラクタa、1つはダイアリシスですが、もう1つのレガシーなシングルコードこの書記素を表す点)。いくつかのコードポイントは決していかなる書記素の一部でもありません(例えば、幅ゼロの非結合子、または方向の上書き)。
グリフはイメージであり、通常はフォント(グリフの集合)に格納され、グラフェンまたはその一部を表すために使用されます。フォントは、複数のグリフを1つの表現に構成することができます。たとえば、上記のäが単一のコードポイントである場合、フォントは2つの別々の空間的にオーバーレイされたグリフとしてレンダリングすることを選択できます。 OTFの場合、フォントのGSUBテーブルとGPOSテーブルには、この作業を行うための置換と位置情報が含まれています。フォントには、同じ書記素の複数の代替グリフも含まれる場合があります。
C#では、文字は実際にはCodePointです。
つまり、もしあなたがLes Misérables
ような有効な文字列を逆にすると、このように見える
string s = "Les Mise\u0301rables";
一連の文字として、次のようになります。
セルセクシー
ご覧のとおり、アクセント記号はe文字ではなくR文字になります。
両方の時間にchar配列を逆順にすると、string.reverse.reverseは元の文字列を返しますが、この種の逆転は元の文字列の逆ではありません。
各GraphemeClusterだけを逆にする必要があります。
したがって、正しく実行されると、次のような文字列を逆にします。
private static System.Collections.Generic.List<string> GraphemeClusters(string s)
{
System.Collections.Generic.List<string> ls = new System.Collections.Generic.List<string>();
System.Globalization.TextElementEnumerator enumerator = System.Globalization.StringInfo.GetTextElementEnumerator(s);
while (enumerator.MoveNext())
{
ls.Add((string)enumerator.Current);
}
return ls;
}
// this
private static string ReverseGraphemeClusters(string s)
{
if(string.IsNullOrEmpty(s) || s.Length == 1)
return s;
System.Collections.Generic.List<string> ls = GraphemeClusters(s);
ls.Reverse();
return string.Join("", ls.ToArray());
}
public static void TestMe()
{
string s = "Les Mise\u0301rables";
// s = "noël";
string r = ReverseGraphemeClusters(s);
// This would be wrong:
// char[] a = s.ToCharArray();
// System.Array.Reverse(a);
// string r = new string(a);
System.Console.WriteLine(r);
}
そして、あなたが正しくこれをやれば、アジア/南アジア/東アジアの言語(そしてフランス語/スウェーデン語/ノルウェー語など)でもうまくいくとわかるでしょう。
文字列内の文字列を置換する
System.String.Replace
メソッドを使用すると、文字列の一部を別の文字列で置き換えることができます。
string s = "Hello World";
s = s.Replace("World", "Universe"); // s = "Hello Universe"
すべての検索文字列が置換されます。
このメソッドは、 String.Empty
フィールドを使用して、文字列の一部を削除するためにも使用できます。
string s = "Hello World";
s = s.Replace("ell", String.Empty); // s = "Ho World"
文字列内の文字の大文字/小文字の変更
System.String
クラスは、文字列内の大文字と小文字の間で変換するいくつかのメソッドをサポートしています。
-
System.String.ToLowerInvariant
は、Stringオブジェクトを小文字に変換して返しSystem.String.ToLowerInvariant
。
-
System.String.ToUpperInvariant
は、大文字に変換されたStringオブジェクトを返すために使用されます。
注意:これらのメソッドの不変バージョンを使用する理由は、予期しないカルチャ固有の文字の生成を防ぐためです。これについてはここで詳しく説明します 。
例:
string s = "My String";
s = s.ToLowerInvariant(); // "my string"
s = s.ToUpperInvariant(); // "MY STRING"
あなたが特定の指定するかを選択できることに注意してください文化を使用して小文字と大文字に変換する際String.ToLower(のCultureInfoを)とString.ToUpper(のCultureInfo)に応じた方法。
文字列の配列を単一の文字列に連結する
System.String.Join
メソッドを使用すると、各要素間に指定されたセパレータを使用して、文字列配列内のすべての要素を連結できSystem.String.Join
。
string[] words = {"One", "Two", "Three", "Four"};
string singleString = String.Join(",", words); // singleString = "One,Two,Three,Four"
文字列連結
文字列連結は、 System.String.Concat
メソッドを使用するか、 +
演算子を使用して(もっと簡単に)行うことができます。
string first = "Hello ";
string second = "World";
string concat = first + second; // concat = "Hello World"
concat = String.Concat(first, second); // concat = "Hello World"
C#6では、これは次のように行うことができます:
string concat = $"{first},{second}";