2012-01-10 23 views
1

の最初のインスタンスを取得する私は、次のスプリットを使用してそれらを分離:C#は、私はそれでキャリッジリターンと文字列が文字列

string[] RemoveEmptySpace = result.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries); 

ので、それはこのようになった:

Server: xxx 
Address: xxx.xxx.11.10 

Non-authoritative answer: 
Name: test.com 
Address: xxx.xxx.888.555 

今、私の質問ですどのようにして、アドレス番号の最初のインスタンスはテキスト(例:'xxx.xxx.11.10 ')でないのですか?位置が変更される可能性があり動的であるので、文字列が... nslookupコマンドから来

おかげ

+1

スプリットごとに分割さ項目再び 'と::

static String getAddress(String[] Haystack) { foreach(String line in Haystack) { if(line.Substring(0, 8) == "Address:") return line.Substring(10); } return ""; } 

あなたはこのようにそれを呼び出すことができます'セパレータとして第二の部分を取ります。 –

+0

'string address = RemoveEmptySpace [1] .Replace(" Address: "、" ")。Trim(); ' – ThePower

+0

上の例の文字列は、これは常に同じですか?または、IPアドレスを持つ文字列のコレクションであると仮定できますか? –

答えて

1

分割から得た文字列のコレクションを繰り返し、「アドレス」で始まる文字列を解析できます。すなわち、このような何か:

string[] RemoveEmptySpace = ...; 

// ... 
foreach (string line in RemoveEmptySpace) 
{ 
    if (line.StartsWith("Address:")) 
    { 
     string[] segments = line.Split(new char[1] { ':' }, StringSplitOptions.RemoveEmptyEntries); 

     // Use the second segment, as this should be the value 
     string value = segments[1].Trim(); 

     // Note: You now have the string representation of the Address numbers. 

     // Stop searching for more addresses 
     break; 
    } 
} 
+0

これも私が考えていたものですが、値には2番目のアドレスが含まれています。 – Zaki

+0

最初のアドレスにヒットしたら操作が途絶えます。私の編集された答えを見てください。 –

+0

トリックをしたおかげで仲間。多くの方々に感謝します – Zaki

2

はちょうど二つの部分(すなわち、作成された文字列に再びSplit(...)関数を適用)に文字列を破ります。

string[] add= arrayStr[1].Split(':'); 
Console.WriteLine("address" + add[1]); // TODO: verify syntax 
+0

さて、私はそれを行うことができますが、2番目の位置の配列が他の文字列である場合はどうでしょうか?cmdコマンドでnslookupを実行すると文字列が来て変更される可能性があります – Zaki

+0

最初の部分( 'add [0]')あなたが望む文字列かどうかを知ることができます。 – NibblyPig

0

反復配列RemoveEmptySpace

チェック、現在のインデックスで文字列、STARTSWITHもしオーバー「アドレス:」

そうならば、:でそれを分割しての値を取得インデックス[1]

breakです。

0

分割アプローチに、あなたは正規表現を使用することができます代わりに:

Regex addrParser = new Regex(@"Address:\s+([\d\.]+)", RegexOptions.Multiline); 
string address = null; 
if (addrParser.IsMatch(result)) { 
    address = addrParser.Match(result).Groups[1].Value; 
} 

を意図したとおり、この作品:

r = new Regex(@"Address:\s+([\d\.]+)", RegexOptions.Multiline); 
r.IsMatch("Address: 123.456.888.555"); // true 

チートシートに見て便利です。http://www.mikesdotnetting.com/Article/46/CSharp-Regular-Expressions-Cheat-Sheet

+0

本当ですか? C#はいつNew(資本Nを持つ)をサポートし始めましたか?あなたのバックスラッシュもひどく間違っています。コードを提供する場合は、少なくともそれが有効な構文を持っていることを確認してください。 -1 – adelphus

+0

@adelphus私は不足している '@'を追加し、 '新しい'のタイプミスを修正し、Regexを改善しました。コメントをいただきありがとうございますが、おそらくあなたは将来的に少し親しみやすいかもしれません。 :) – ANeves

+0

ああ、私は試しています。今のところ私はあなたの2度目の試みの後でさえ、コードは絶望的には解消できないという知識に満足しています。 – adelphus

1

分割した後、これを実行します。

var firstAddress = 
    (from line in RemoveEmptySpace 
    let split = line.Split(new[] { ':' }) 
    where split[0] == "Address" 
    select split[1]).First(); 

(これを行うには、ファイルの先頭にusing System.Linq;を追加する必要があります)

2

正規表現はあなたの友人です。

Match m = Regex.Match(result, "Address\\:\\s*(\\d+(\\.\\d+)+)"); 
if (m.Success) { 
    string address = m.Groups[1]; // m.Groups[1] returns the dotted address part 
} 

は、あなたがあなたの配列の各要素のために試合を行うこともできますが、それだけでresult文字列を使用する方が簡単でしょう:あなたの結果は常にフレーズ"Address: nnn.nnn.nnn.nnn"が含まれていると仮定すると、あなたは簡単に行うことができます。

+0

+1文字列の先頭に '@'を付け、二重バックスラッシュを削除することで、正規表現をより読みやすくすることができます。 – ANeves

0

この機能を使用:

getAddress(RemoveEmptySpace) 
関連する問題