programming/netfx/string/1_operations/index.wiki.txt

current previous
451,9 451,9
 

        

        
 

        

        
 
**分割 (Split) [#String.Split]
**分割 (Split) [#String.Split]
~
&msdn(netfx,member,System.String.Split){String.Splitメソッド};は文字列の分割を行うメソッドで、区切りとなる文字(``char``/``Char``)または文字列を指定し、それを区切りとして分割した結果を文字列の配列で返します。
&msdn(netfx,member,System.String.Split){String.Splitメソッド};は文字列の分割を行うメソッドで、指定した文字または文字列を区切りとして分割した結果を文字列の配列で返します。
 

        

        
~
$samplecode(lang=c#,copyright-year=2016,String.Splitメソッドを使って指定した区切り文字で文字列を分割する)
$samplecode(lang=c#,copyright-year=2016,String.Splitメソッドを使って文字列を区切り文字に従って分割する)
 
#code(code-id=3aa1eae0-0241-11eb-9071-75842ffbe222){{
#code(code-id=3aa1eae0-0241-11eb-9071-75842ffbe222){{
 
using System;
using System;
 

        

        
461,7 461,7
 
  static void Main()
  static void Main()
 
  {
  {
 
    var s = "The quick brown fox jumps over the lazy dog";
    var s = "The quick brown fox jumps over the lazy dog";
~
    var words = s.Split(' '); // 空白文字' 'を区切りとして文字列sを分割
    var words = s.Split(' '); // 空白を区切りとして文字列sを分割
 

        

        
 
    foreach (var word in words) {
    foreach (var word in words) {
 
      Console.WriteLine(word);
      Console.WriteLine(word);
476,7 476,7
 
Class Sample
Class Sample
 
  Shared Sub Main()
  Shared Sub Main()
 
    Dim s As String = "The quick brown fox jumps over the lazy dog"
    Dim s As String = "The quick brown fox jumps over the lazy dog"
~
    Dim words As String() = s.Split(" "c) ' 空白文字" "を区切りとして文字列sを分割
    Dim words As String() = s.Split(" "c) ' 空白を区切りとして文字列sを分割
 

        

        
 
    For Each word As String In words
    For Each word As String In words
 
      Console.WriteLine(word)
      Console.WriteLine(word)
498,128 498,40
 
}}
}}
 
$samplecode$
$samplecode$
 

        

        
+
$samplecode(lang=c#,copyright-year=2020,String.Splitメソッドを使って指定した区切り文字列で文字列を分割する)
+
#code(code-id=a701ed37-15f3-11eb-ad02-1d3b4b62e371){{
+
using System;
+

         
+
class Sample {
+
  static void Main()
+
  {
+
    var s = "The quick brown\r\nfox jumps over\r\nthe lazy dog";
+
    var lines = s.Split("\r\n"); // 改行の文字列"\r\n"を区切りとして文字列sを分割
+

         
+
    foreach (var line in lines) {
+
      Console.WriteLine(line);
+
    }
+
  }
+
}
+
}}
+
$samplecode(lang=vb)
+
#code(code-id=a7020ca3-15f3-11eb-ad02-1d3b4b62e371){{
+
Imports System
+

         
+
Class Sample
+
  Shared Sub Main()
+
    Dim s As String = "The quick brown" + vbCrLf + "fox jumps over" + vbCrLf + "the lazy dog"
+
    Dim lines As String() = s.Split(vbCrLf) ' 改行の文字列vbCrLfを区切りとして文字列sを分割
+

         
+
    For Each line As String In lines
+
      Console.WriteLine(line)
+
    Next
+
  End Sub
+
End Class
+
}}
+
$samplecode
+
#prompt{{
+
The quick brown
+
fox jumps over
+
the lazy dog
+
}}
+
$samplecode$
+

         
+
String.Splitメソッドでは、区切りとなる文字または文字列を複数指定することもできます。 この場合、どれか一つに一致する箇所があれば、そこを区切りとして分割が行われます。
+

         
+
$samplecode(lang=c#,copyright-year=2020,String.Splitメソッドを使って複数の区切り文字で文字列を分割する)
+
#code(code-id=a7020d96-15f3-11eb-ad02-1d3b4b62e371){{
+
using System;
+

         
+
class Sample {
+
  static void Main()
+
  {
+
    var s = "The quick\nbrown fox\tjumps over\rthe lazy dog";
+
    var phrases = s.Split(new[] {'\r', '\n', '\t'}); // CR/LF/TABを区切りとして文字列sを分割
+

         
+
    foreach (var phrase in phrases) {
+
      Console.WriteLine(phrase);
+
    }
+
  }
+
}
+
}}
+
$samplecode(lang=vb)
+
#code(code-id=a7020e04-15f3-11eb-ad02-1d3b4b62e371){{
+
Imports System
+

         
+
Class Sample
+
  Shared Sub Main()
+
    Dim s As String = "The quick" + vbLf + "brown fox" + vbTab + "jumps over" + vbCr + "the lazy dog"
+
    Dim phrases As String() = s.Split(New Char() { vbCr, vbLf, vbTab }) ' CR/LF/TABを区切りとして文字列sを分割
+

         
+
    For Each phrase As String In phrases
+
      Console.WriteLine(phrase)
+
    Next
+
  End Sub
+
End Class
+
}}
+
$samplecode
+
#prompt{{
+
The quick
+
brown fox
+
jumps over
+
the lazy dog
+
}}
+
$samplecode$
+

         
+
String.Splitメソッドでは、分割時の動作オプションを&msdn(netfx,type,System.StringSplitOptions){StringSplitOptions};で指定することができます。
 

        

        
+
StringSplitOptionsでは、分割によって生じる空の要素を除外する[[RemoveEmptyEntries>#StringSplitOptions.RemoveEmptyEntries]]、分割によって生じる前後の空白を削除する[[TrimEntries>#StringSplitOptions.TrimEntries]]を指定することができます。 特に指定しない場合、StringSplitOptions.Noneを指定した場合は、デフォルトの動作となります。
 

        

        
~
$remarks
&msdn(netfx,member,System.String.Split){String.Splitメソッド};では、文字列分割時のオプションとして&msdn(netfx,type,System.StringSplitOptions){StringSplitOptions};を指定できます。 これは分割を行った場合に生じる空の要素をどう扱うかを指定するためのものです。 StringSplitOptions.RemoveEmptyEntriesを指定した場合は、空の要素は結果から取り除かれます。 StringSplitOptions.Noneはデフォルトの値で、空の要素もそのまま返されます。
+
正規表現を用いて分割を行いたい場合は、[[Regex.Splitメソッド>programming/netfx/regex/0_abstract#Regex.Split]]を使用します。
+
$remarks$
 

        

        
~
***空の要素の除外 (StringSplitOptions.RemoveEmptyEntries) [#StringSplitOptions.RemoveEmptyEntries]
$samplecode(lang=c#,copyright-year=2016,String.SplitメソッドにおけるStringSplitOptionsの動作の違い)
+
&msdn(netfx,member,System.String.Split){String.Splitメソッド};で&msdn(netfx,member,System.StringSplitOptions.RemoveEmptyEntries){StringSplitOptions.RemoveEmptyEntries};を指定すると、分割によって空の要素(長さ0の部分)が生じた場合に、それを除外することができます。
+

         
+
$samplecode(lang=c#,copyright-year=2016,StringSplitOptions.RemoveEmptyEntriesを指定して空となる要素を除外して文字列を分割する)
 
#code(code-id=3aa1f88d-0241-11eb-9071-75842ffbe222){{
#code(code-id=3aa1f88d-0241-11eb-9071-75842ffbe222){{
 
using System;
using System;
 

        

        
 
class Sample {
class Sample {
 
  static void Main()
  static void Main()
 
  {
  {
~
    var s = "field1,,field3,field4,"; // カンマ区切りの文字列(空のカラムを含む)
    var s = "<>field1<><>field2<>field3";
-
    string[] fields;
 

        

        
~
    // 文字','を区切りとして分割し、空の要素を除外する
    // 文字列"<>"を区切りとして分割、空の要素は削除する
~
    Console.WriteLine($"[{nameof(StringSplitOptions.RemoveEmptyEntries)}]");
    Console.WriteLine("StringSplitOptions.RemoveEmptyEntries");
 

        

        
~
    var fields = s.Split(',', StringSplitOptions.RemoveEmptyEntries);
    fields = s.Split(new string[] {"<>"}, StringSplitOptions.RemoveEmptyEntries);
 

        

        
~
    Console.WriteLine($"Length = {fields.Length}");
    Console.WriteLine("(count = {0})", fields.Length);
 

        

        
 
    foreach (var field in fields) {
    foreach (var field in fields) {
~
      Console.WriteLine("<{0}>", field);
      Console.WriteLine(field);
 
    }
    }
+
    Console.WriteLine();
 

        

        
~
    // 文字','を区切りとして分割する (空の要素はそのままにする)
    // 文字列"<>"を区切りとして分割、空の要素は削除せずそのままにする
~
    Console.WriteLine($"[{nameof(StringSplitOptions.None)}]");
    Console.WriteLine("StringSplitOptions.None");
 

        

        
~
    fields = s.Split(',', StringSplitOptions.None);
    fields = s.Split(new string[] {"<>"}, StringSplitOptions.None);
 

        

        
~
    Console.WriteLine($"Length = {fields.Length}");
    Console.WriteLine("(count = {0})", fields.Length);
 

        

        
 
    foreach (var field in fields) {
    foreach (var field in fields) {
~
      Console.WriteLine("<{0}>", field);
      Console.WriteLine(field);
 
    }
    }
 
  }
  }
 
}
}
630,136 542,50
 

        

        
 
Class Sample
Class Sample
 
  Shared Sub Main()
  Shared Sub Main()
~
    Dim s As String = "field1,,field3,field4," ' カンマ区切りの文字列(空のカラムを含む)
    Dim s As String = "<>field1<><>field2<>field3"
 
    Dim fields As String()
    Dim fields As String()
 

        

        
~
    ' 文字','を区切りとして分割し、空の要素を除外する
    ' 文字列"<>"を区切りとして分割、空の要素は削除する
~
    Console.WriteLine($"[{NameOf(StringSplitOptions.RemoveEmptyEntries)}]")
    Console.WriteLine("StringSplitOptions.RemoveEmptyEntries")
 

        

        
~
    fields = s.Split(","c, StringSplitOptions.RemoveEmptyEntries)
    fields = s.Split(New String() {"<>"}, StringSplitOptions.RemoveEmptyEntries)
 

        

        
~
    Console.WriteLine($"Length = {fields.Length}")
    Console.WriteLine("(count = {0})", fields.Length)
 

        

        
 
    For Each field As String In fields
    For Each field As String In fields
~
      Console.WriteLine("<{0}>", field)
      Console.WriteLine(field)
 
    Next
    Next
+
    Console.WriteLine()
 

        

        
~
    ' 文字列","を区切りとして分割する (空の要素はそのままにする)
    ' 文字列"<>"を区切りとして分割、空の要素は削除せずそのままにする
~
    Console.WriteLine($"[{NameOf(StringSplitOptions.None)}]")
    Console.WriteLine("StringSplitOptions.None")
 

        

        
~
    fields = s.Split(","c, StringSplitOptions.None)
    fields = s.Split(New String() {"<>"}, StringSplitOptions.None)
 

        

        
~
    Console.WriteLine($"Length = {fields.Length}")
    Console.WriteLine("(count = {0})", fields.Length)
 

        

        
 
    For Each field As String In fields
    For Each field As String In fields
~
      Console.WriteLine("<{0}>", field)
      Console.WriteLine(field)
 
    Next
    Next
 
  End Sub
  End Sub
 
End Class
End Class
 
}}
}}
 
$samplecode
$samplecode
 
#prompt{{
#prompt{{
~
[RemoveEmptyEntries]
StringSplitOptions.RemoveEmptyEntries
~
Length = 3
(count = 3)
~
<field1>
field1
~
<field3>
field2
~
<field4>
field3
~

         
StringSplitOptions.None
~
[None]
(count = 5)
+
Length = 5
+
<field1>
+
<>
+
<field3>
+
<field4>
+
<>
+
}}
+
$samplecode$
+

         
+

         
+
***前後の空白の削除 (StringSplitOptions.TrimEntries) [#StringSplitOptions.TrimEntries]
+
&msdn(netfx,member,System.String.Split){String.Splitメソッド};で&msdn(netfx,member,System.StringSplitOptions.TrimEntries){StringSplitOptions.TrimEntries};を指定すると、分割によって各要素の前後に空白が生じる場合に、それを削除することができます。 これは、Splitメソッドで分割した後に個々の要素に対して[[String.Trimメソッド>#String.Trim]]を呼び出し、前後の空白を削除するのと同じ動作となります。
+

         
+
StringSplitOptions.TrimEntriesは.NET 5以降で使用できます。
+

         
+
$samplecode(lang=c#,copyright-year=2020,target-framework=net5,StringSplitOptions.TrimEntriesを指定して各要素の前後の空白を削除して文字列を分割する)
+
#code(code-id=a70210bf-15f3-11eb-ad02-1d3b4b62e371){{
+
using System;
+

         
+
class Sample {
+
  static void Main()
+
  {
+
    var s = " field1,   field2 ,field3  "; // カンマ区切りの文字列(各カラムの前後に余白を含む)
+

         
+
    // 文字','を区切りとして分割し、各要素の前後の空白を除去する
+
    Console.WriteLine($"[{nameof(StringSplitOptions.TrimEntries)}]");
+

         
+
    var fields = s.Split(',', StringSplitOptions.TrimEntries);
+

         
+
    foreach (var field in fields) {
+
      Console.WriteLine("<{0}>", field);
+
    }
+
    Console.WriteLine();
+

         
+
    // 文字','を区切りとして分割する (各要素の前後の空白はそのままにする)
+
    Console.WriteLine($"[{nameof(StringSplitOptions.None)}]");
+

         
+
    fields = s.Split(',', StringSplitOptions.None);
+

         
+
    foreach (var field in fields) {
+
      Console.WriteLine("<{0}>", field);
+
    }
+
  }
+
}
+
}}
+
$samplecode(lang=vb)
+
#code(code-id=a7021180-15f3-11eb-ad02-1d3b4b62e371){{
+
Imports System
+

         
+
Class Sample
+
  Shared Sub Main()
+
    Dim s As String = " field1,   field2 ,field3  " ' カンマ区切りの文字列(各カラムの前後に余白を含む)
+
    Dim fields As String()
+

         
+
    ' 文字','を区切りとして分割し、各要素の前後の空白を除去する
+
    Console.WriteLine($"[{NameOf(StringSplitOptions.TrimEntries)}]")
+

         
+
    fields = s.Split(","c, StringSplitOptions.TrimEntries)
 

        

        
~
    For Each field As String In fields
field1
+
      Console.WriteLine("<{0}>", field)
+
    Next
+
    Console.WriteLine()
 

        

        
~
    ' 文字列","を区切りとして分割する (各要素の前後の空白はそのままにする)
field2
~
    Console.WriteLine($"[{NameOf(StringSplitOptions.None)}]")
field3
+

         
+
    fields = s.Split(","c, StringSplitOptions.None)
+

         
+
    For Each field As String In fields
+
      Console.WriteLine("<{0}>", field)
+
    Next
+
  End Sub
+
End Class
+
}}
+
$samplecode
+
#prompt{{
+
[TrimEntries]
+
<field1>
+
<field2>
+
<field3>
+

         
+
[None]
+
< field1>
+
<   field2 >
+
<field3  >
 
}}
}}
 
$samplecode$
$samplecode$
 

        

        
+
なお、このオプションでは[[String.Trimメソッド>#String.Trim]]と同様に&msdn(netfx,member,System.Char.IsWhiteSpace){Char.IsWhiteSpace};が```true```となる''空白文字''が削除されます。 ''空白文字''には改行文字等も含まれます。
+

         
+

         
+

         
 
**結合 (Join) [#String.Join]
**結合 (Join) [#String.Join]
 
&msdn(netfx,member,System.String.Join){String.Joinメソッド};は配列の結合を行う静的メソッドで、結合時の区切り文字と配列を指定し、それらを結合した結果を返します。 区切り文字には空の文字列を指定することもできます。 (結果は[[String.Concat>#String.Concat]]メソッドによる連結と同じになります)
&msdn(netfx,member,System.String.Join){String.Joinメソッド};は配列の結合を行う静的メソッドで、結合時の区切り文字と配列を指定し、それらを結合した結果を返します。 区切り文字には空の文字列を指定することもできます。 (結果は[[String.Concat>#String.Concat]]メソッドによる連結と同じになります)
 

        

        
869,7 695,7
 
$samplecode$
$samplecode$
 

        

        
 
$remarks
$remarks
~
このメソッドでは、半角および全角のスペースやタブだけでなく、改行文字なども空白文字として扱われます。 .NET Framework 4以降では、Unicodeで空白文字と定義されている文字(&msdn(netfx,member,System.Char.IsWhiteSpace){Char.IsWhiteSpace};が```true```となる文字)が空白文字として扱われます。 それ以前のバージョンでの空白文字の扱いなど詳細は.NET Frameworkのドキュメントを参照してください。
このメソッドでは、半角および全角のスペースやタブだけでなく、改行文字なども空白文字として扱われます。 .NET Framework 4以降では、Unicodeで空白文字と定義されている文字(&msdn(netfx,member,System.Char.IsWhiteSpace){Char.IsWhiteSpace};が``true``となる文字)が空白文字として扱われます。 それ以前のバージョンでの空白文字の扱いなど詳細は.NET Frameworkのドキュメントを参照してください。
 
$remarks$
$remarks$