2013-03-27 10 views
21

RegexクラスのSplit関数を使用して文字列を分割したいとします。問題は、が区切り文字のを取り除き、私はそれらを保持したいということです。好ましくは、スプリット内の別個の要素として。Regex.Splitの区切り文字を保持する方法は?

私が見つけたother discussionsによれば、それを達成するための不便な方法しかありません。

提案がありますか?

+6

入力文字列?あなたの正規表現?期待される出力? – I4V

+0

この '.etc'はあまり情報を与えません。あなたのアルゴリズムについては、私は少なくとも試すことができます。私の答えを参照 – I4V

+6

なぜあなたはとても攻撃的になるのですか? qood質問をして、より良い答えを得るだけです。あなたがしたいことは、 'Regex.Split'がなくても実行できます。 [this](http://www.perlmonks.org/?node=xy+problem)を見て、私の答えをもう一度読んでください。 – I4V

答えて

59

ただ、キャプチャグループに模様を入れ、試合も結果に含まれます。

string[] result = Regex.Split("123.456.789", @"(\.)"); 

結果:

  • JavaScriptの"123.456.789".split(/(\.)/g)
  • Pythonの:これはまた、他の多くの言語のために働く

    { "123", ".", "456", ".", "789" } 
    

    re.split(r"(\.)", "123.456.789")

  • のPerlsplit(/(\.)/g, "123.456.789")

(未ジャワが)

+0

ああ、これはさらに良かった!面白い例 - あなたは**実際には**期間である任意の*と一致します。 +1は素晴らしい構文のために!しかし何らかの理由で最後の要素を捕まえていないので、あなたが言ったことを得るだけですが、* 789 *の部分を除いて**です。 –

+0

先読みをしている間、私はそれが以下のような結果に含まれていないことを読んでいます: Regex.Match( "25マイル以上"、@ "\ d + \ s(?= miles)");//出力:25 と別の文では、分割している間に区切り記号を含めると、パターンが正のルックアヘッドになることを示しています: Regex.Split( "oneTwoThree"、@ "(?= [A-Z]))); // OUTPUT one Two Three 混乱 –

+1

@sortednounルックアヘッドは、ボディがその位置から一致する場合に限り、ゼロ文字にマッチします。先読み体は試合の一部ではないので、追加するものは何もありません。本文でマッチしたテキストは、分割するときに次の配列項目に含まれます。 '(?=([A-Z])))'は、文字で余分な項目を作成し、それを次の項目に含めます。 –

0

は、それらをバック追加:

string[] Parts = "A,B,C,D,E".Split(','); 
    string[] Parts2 = new string[Parts.Length * 2 - 1]; 
    for (int i = 0; i < Parts.Length; i++) 
    { 
     Parts2[i * 2] = Parts[i]; 
     if (i < Parts.Length - 1) 
      Parts2[i * 2 + 1] = ","; 
    } 
+1

しかし、正規表現に2つ以上の可能なマッチがある場合、それは機能しません。 – AJMansfield

+1

デリミタが使用されているかどうかわからない場合はどうしますか? Regex *クラスのサンプルを繰り返してもらえますか? –

6

使用Matches値とセパレータを取得し、その後、文字列の区切りを見つけること。

例:

string input = "asdf,asdf;asdf.asdf,asdf,asdf"; 

var values = new List<string>(); 
int pos = 0; 
foreach (Match m in Regex.Matches(input, "[,.;]")) { 
    values.Add(input.Substring(pos, m.Index - pos)); 
    values.Add(m.Value); 
    pos = m.Index + m.Length; 
} 
values.Add(input.Substring(pos)); 
+0

ああ、私はそれを得る。クール。それでも、デリミタを保持する必要があるかどうかを判断するためにブールを取る余分な* Split *があることを望みます。私はコーディングを開始する必要がありますね。ありがとう!明確な返信の場合+1。 –

3

は、入力が "abc1defg2hi3jkl" で、正規表現が数字を選ぶことであると言います。

String input = "abc1defg2hi3jkl"; 
var parts = Regex.Matches(input, @"\d+|\D+") 
      .Cast<Match>() 
      .Select(m => m.Value) 
      .ToList(); 

部品は次のようになります。abc1defg2hi3jkl

関連する問題