2011-07-13 14 views
1

私がやっていることは、文字列を後方に分割することです。意味は右から左。C#文字列を後方に分割する方法は?

string startingString = "<span class=\"address\">Hoopeston,, IL 60942</span><br>" 

これは私が通常行うことです。

string[] splitStarting = startingString.Split('>'); 

ので、私のsplitStarting[1]= "Hoopeston,, IL 60942</span"

その後、私はそうsplitAgain[0]

string[] splitAgain = splitStarting[1].Split('<'); 

を行うだろうう= "Hoopeston,, IL 60942"

は今、これは私が何をしたいのか、私は 'で分割したいされます'(スペース)は、最後の2つのインスタンス' 'に対して逆になります。これはさらに難しく私は今までに最初の二つの逆の分割をしたいようにするには、ので、通常私はこの

string[] splitCity,Zip = splitAgain[0].Split(new char[] { ' ' }, 3); 
ような何かをするだろう

[0]="60942" 

[1]="IL" 

[2] = "Hoopeston,," 

例えば、私の配列はそうのように戻ってくるだろう

しかし、あなたはそれを後ろ向きにしますか?その理由は、2つの名前の都市になる可能性があるからです。余分な都市名を壊すからです。

+0

私は、問題は実際には、国の後ろにする必要がありますいくつかの人々が実際に置くことを願っています。私はコンマで分割するのをやめようとしています。 –

+0

なぜ最後の文字列を '、'で分割したくないのですか? – UrbanEsc

+0

手作業のエントリーなので、状態の前にコンマを入れている人もいるので... –

答えて

2

正規表現。文字列を逆にする必要はありません。ちょうどあなたが望むものを引き出す。

var pattern = @">(?<city>.*) (?<state>.*) (?<zip>.*?)<"; 
var expression = new Regex(pattern); 
Match m = expression .Match(startingString); 
if(m.success){ 
    Console.WriteLine("Zip: " + m.Groups["zip"].Value); 
    Console.WriteLine("State: " + m.Groups["state"].Value); 
    Console.WriteLine("City: " + m.Groups["city"].Value); 
} 

は、以下の結果を与える必要があります:

Found 1 match: 

    1. >Las Vegas,, IL 60942< has 3 groups: 
     1. Las Vegas,, (city) 
     2. IL (state) 
     3. 60942 (zip) 

String literals for use in programs: 

C# 
    @">(?<city>.*) (?<state>.*) (?<zip>.*?)<" 
0

どの程度

using System.Linq 
... 
splitAgain[0].Split(' ').Reverse().ToArray() 

-edit-

OK]をクリックしてマルチ言葉についての最後の部分は引用逃し、あなたはまだかかわらず、LINQを使用することができます。

splitAgain[0].Split(' ').Reverse().Take(2).ToArray() 

はあなたに

になるだろう
[0]="60942" 
[1]="IL" 

、あなたはまだ1つのステートメントで全体のことを行うことができますが、それは少し厄介だろうけれども都市はここに含まれないであろう。

var elements = splitAgain[0].Split(' '); 
var result = elements 
    .Reverse() 
    .Take(2) 
    .Concat(new[ ] { String.Join(" " , elements.Take(elements.Length - 2).ToArray()) }) 
    .ToArray(); 

だから我々は、文字列を分割

  • だ、
  • 二つの第一の要素(本来最後の二つの)
  • はその後、我々は、単一の文字列要素を使用して新しい配列を作成し、要素の元の配列からその文字列を作るを取るそれを逆
  • マイナス最後の2つの要素(郵便番号と郵便番号)

私は言ったように、おしゃれな、しかしあなたが望む配列を取得します。あなたがそのフォーマットの配列である必要がなければ、明らかに上記のコードを少し単純化することができます。

あなたも行うことができます:

まず
var result = new[ ]{ 
       elements[elements.Length - 1], //last element 
       elements[elements.Length - 2], //second to last 
       String.Join(" " , elements.Take(elements.Length - 2).ToArray()) //rebuild original string - 2 last elements 
      }; 
+0

-1:都市が「ラスベガス」のときは動作しません。彼の最後の部分を参照して "これをさらに困難にする"。 –

+0

でも問題ありませんが、Array.Reverse()の場合も同様です。 – aL3891

0

私はあなたが配列を使用する必要がありますと思いました。Reverse()メソッドを使用していましたが、今問題となっている ''(スペース)上で分割されていることがわかります。 最初の値にスペースがある場合(つまり「ニューヨーク」)、スペースを分割したくない場合があります。

文字列の値が3つしかない場合は、String.LastIndexOf( "")を使用してString.SubString()を使用してそれをトリミングし、再度同じ操作を行うことができます真ん中の値を見つけたら、スペースの有無にかかわらず、最初の値が残されます。

+0

-1:aL3891の回答へのコメントを参照してください。 –

0

私はあなたがこのようにそれを行うべきだと思う:

var s = splitAgain[0]; 
var zipCodeStart = s.LastIndexOf(' '); 
var zipCode = s.Substring(zipCodeStart + 1); 
s = s.Substring(0, zipCodeStart); 
var stateStart = s.LastIndexOf(' '); 
var state = s.Substring(stateStart + 1); 
var city = s.Substring(0, stateStart); 
var result = new [] {zipCode, state, city}; 

結果は、あなたが要求したものを含んでいます。

+0

@downvoter:私は間違った**答えを下落させたので、単に下降しているのではないことを示すコメントを残しておきます。私の答えは、OPのスペックを満たしています。 –

0

最適ではないがコード化が容易な解決策の1つは、文字列を逆順にし、「通常」の機能を使用して文字列を分割し、個々の分割部分をそれぞれ逆にすることです。

代わりに、正規表現を使用することもできます。

0

Splitがすべてを行うことができた場合、混乱するほど多くのオーバーロードが発生します。

分割文字列とlastIndexOfを持つカスタムコードだけを使用しないでください。

string str = "Hoopeston,, IL 60942"; 
    string[] parts = new string[3]; 
    int place = str.LastIndexOf(' '); 
    parts[0] = str.Substring(place+1); 
    int place2 = str.LastIndexOf(' ',place-1); 
    parts[1] = str.Substring(place2 + 1, place - place2 -1); 
    parts[2] = str.Substring(0, place2); 
0

あなたは、タグ内の文字列の三つの部分を取得するには、正規表現を使用して、正しい順序で文字列を取得するためにLINQの拡張機能を使用することができます。

例:

string startingString = "<span class=\"address\">East St Louis,, IL 60942</span><br>"; 

string[] city = 
    Regex.Match(startingString, @"^.+>(.+) (\S+) (\S+?)<.+$") 
    .Groups.Cast<Group>().Skip(1) 
    .Select(g => g.Value) 
    .Reverse().ToArray(); 

Console.WriteLine(city[0]); 
Console.WriteLine(city[1]); 
Console.WriteLine(city[2]); 

出力:そんなに単純なものを作るという名前のグループと

60942 
IL 
East St Louis,, 
0

は、オーディオファイル名のきまりと同様の問題に直面していました。

このようにして、文字列から配列への変換、逆および分割、および各部分を通常に戻す。

 char[] addressInCharArray = fullAddress.ToCharArray(); 
     Array.Reverse(addressInCharArray); 

     string[] parts = (new string(addressInCharArray)).Split(new char[] { ' ' }, 3); 
     string[] subAddress = new string[parts.Length]; 

     int j = 0; 
     foreach (string part in parts) 
     { 
      addressInCharArray = part.ToCharArray(); 
      Array.Reverse(addressInCharArray); 
      subAddress[j++] = new string(addressInCharArray); 
     } 
関連する問題