C#で複数文字の区切り文字で文字列を分割するにはどうすればよいですか?


232

単語である区切り文字を使用して文字列を分割したい場合はどうなりますか?

たとえば、This is a sentence

私は上で分割したいisとget Thisa sentence

ではJava、区切り文字として文字列を送信できますが、これをどのように行うのC#ですか?

回答:


281

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

ドキュメントの例:

string source = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] {"[stop]"};
string[] result;

// ...
result = source.Split(stringSeparators, StringSplitOptions.None);

foreach (string s in result)
{
    Console.Write("'{0}' ", String.IsNullOrEmpty(s) ? "<>" : s);
}

7
これは実際には次を返します:質問で指定された例を使用した「Th」「「」文」。多分これは彼が実際に望んでいることですが、彼が指定したものではありません。
IRBMe 2009

6
これは単なる例です...重要な点は、文字列を区切り文字として使用するString.Splitがあります。
ブルーノコンデ

1
はい、しかしそれは質問が指定することをしません。出力を指定するには、もう少し賢いものを使用する必要があります。ここで、指定された質問が実際に質問者が望んでいるものであるかどうかは別の質問ですが、ここで尋ねられた質問は、String.Splitだけでは簡単に答えることができません。
IRBMe 2009

3
まだうまくいきません。分割する単語にスペースを含めると、それらは出力に含まれません。質問の例を見ると、実際にはスペースが含まれていることがわかります。「である」で分割すると、「これ」と「文」ではなく、「これ」と「文」が得られます。「これ」の終わりと「文」の始まりの微妙なスペースに注意してください。繰り返しますが、この答えはおそらく質問者が実際に望んでいるものですが、それは彼が尋ねたものではありません。繰り返しますが、String.Splitは簡単には解決しません。
IRBMe 2009

2
@IRBMe質問を読みましたか?「私は「is」で分割したい。だから「これ」と「一文」がもらえる。結果のスペースを参照してください??? これは、Splitがまさに行うことです。
ブルーノコンデ

55

次のようなRegex.Splitメソッドを使用できます。

Regex regex = new Regex(@"\bis\b");
string[] substrings = regex.Split("This is a sentence");

foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

編集:これはあなたが与えた例を満足させます。通常のString.Splitも「This」という単語の最後の「is」で分割されることに注意してください。そのため、Regexメソッドを使用し、「is」の周りに単語の境界を含めました。ただし、あなただけのエラーでこの例を書いた場合、そののstring.Splitはおそらく十分でしょう。


@編集:私もどちらかわかりませんが、彼の目的が単語「is」のみを削除することである場合は、通常の文字列分割を使用して、どちらかの側にスペースを埋め込むことができます。
ahawker 09/07/14

1
文字列内で分割された単語の位置がわからない場合、スペースが左、右、またはその両方のいずれに移動する必要があるかわからないため、これも機能しません(少なくとも多くの努力なしでは) 。
IRBMe 2009

String.Splityを使用すると、既に文字列を分割できるため、複雑すぎるようです...
Ed S.

3
私はすでに私の回答の編集、上記のコメント、および別の回答の3つのコメントでこれに対処しました。String.Splitは、質問で提供されている例では機能しません。その理由を説明して、もう一度繰り返すことはしません。知りたい場合は、他のすべてのコメントを読むことができます。
IRBMe 2009

正規表現の分割メソッドは、変数の前の区切り文字と後の区切り文字を削除しないことに注意してください... :(
melaos

34

この投稿の既存の応答に基づいて、これは実装を簡素化します:)

namespace System
{
    public static class BaseTypesExtensions
    {
        /// <summary>
        /// Just a simple wrapper to simplify the process of splitting a string using another string as a separator
        /// </summary>
        /// <param name="s"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static string[] Split(this string s, string separator)
        {
            return s.Split(new string[] { separator }, StringSplitOptions.None);
        }


    }
}

9
+1、これは拡張メソッドを叫びます。これが組み込みのオーバーロードの1つではないことはほとんどばかげています。
Todd Menier、2013年

9
@ToddMenier「ほぼ」とはどういう意味ですか?
mwardm 2014

28
string s = "This is a sentence.";
string[] res = s.Split(new string[]{ " is " }, StringSplitOptions.None);

for(int i=0; i<res.length; i++)
    Console.Write(res[i]);

EDIT:あなたがいるという事実維持するために、アレイ内のスペースを両側にパディングされる「さ」だけの単語をしたいが、「これは」無傷で残って文や単語から削除「されます」。


8

...要するに:

string[] arr = "This is a sentence".Split(new string[] { "is" }, StringSplitOptions.None);

5

String.Replace()を使用して、目的の分割文字列を文字列に出現しない文字に置き換え、その文字に対してString.Splitを使用して、結果の文字列を分割し、同じ効果を得ることができます。


5

または、このコードを使用します。(同じ:新しいString [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)

3

文字列セパレータで分割を行う拡張関数を次に示します。

public static string[] Split(this string value, string seperator)
{
    return value.Split(new string[] { seperator }, StringSplitOptions.None);
}

使用例:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");

0
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in

-5
string strData = "This is much easier"
int intDelimiterIndx = strData.IndexOf("is");
int intDelimiterLength = "is".Length;
str1 = strData.Substring(0, intDelimiterIndx);
str2 = strData.Substring(intDelimiterIndx + intDelimiterLength, strData.Length - (intDelimiterIndx + intDelimiterLength));

19
コードを投稿する前に、そうでないことを示していない限り、おそらく最初にコンパイラーを介して実行してみる必要があります。最初の行にセミコロンがないため、str1とstr2が定義されていません。言うまでもなく、コードは実際にはOPが望んだように機能しません。このコードはそれを「Th」と「はるかに簡単」に分割します。
マンドレコ2011
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.