2016-08-16 2 views
-2

Ich möchte einen bestimmten Teil einer Ausgabezeichenfolge (der Servername) nehmen. Es funktioniert, aber ich gebe mehr Zeichen zurück, als ich brauche, und ich möchte nur den Servernamen.Wie Teil einer Zeichenfolge ohne Verwendung von Teilzeichenfolge

Mein Code:

 Process process = new Process(); 
     process.StartInfo.FileName = "cmd.exe"; 
     process.StartInfo.Arguments = "/c nslookup -type=mx gmail.com"; // Note the /c command (*) 
     process.StartInfo.UseShellExecute = false; 
     process.StartInfo.RedirectStandardOutput = true; 
     process.StartInfo.RedirectStandardError = true; 
     process.Start(); 
     //* Read the output (or the error) 
     string output = process.StandardOutput.ReadToEnd(); 


     MessageBox.Show(output); 

     string[] tokens = output.Split(' '); 

     //take my server name 
     string retVal = tokens[11]; 


     MessageBox.Show(retVal); 

Meine Ausgabe String:

Servidor: UnKnown 
Address: 192.168.0.1 

Não é resposta autoritativa: 
hotmail.com  MX preference = 5, mail exchanger = mx3.hotmail.com//I WANT THIS STRING "mx3.hotmail.com", the first name server 
hotmail.com  MX preference = 5, mail exchanger = mx4.hotmail.com 
hotmail.com  MX preference = 5, mail exchanger = mx1.hotmail.com 
hotmail.com  MX preference = 5, mail exchanger = mx2.hotmail.com 

mx4.hotmail.com internet address = 207.46.8.167 
mx4.hotmail.com internet address = 65.54.188.126 
mx4.hotmail.com internet address = 65.54.188.110 
mx4.hotmail.com internet address = 65.54.188.94 
mx4.hotmail.com internet address = 65.55.37.104 
mx4.hotmail.com internet address = 65.55.92.184 
mx4.hotmail.com internet address = 65.55.92.168 
mx4.hotmail.com internet address = 65.55.33.119 
mx4.hotmail.com internet address = 207.46.8.199 
... 

meine retVal (Variablenname):

mx3.hotmail.com hotmail MX 

Ich will nur "mx3.hotmail.com"

PS: retVal.Substring (0, 14); funktionieren nicht für mich, weil der Servername lengths variiert.

danke! = D

+0

retVal.Split (‘‚) [0] – serhiyb

+0

zurückgeben "=" –

+0

auf der Grundlage Ihrer Frage retVal enthält „mx3.h otmail.com hotmail MX "und offensichtlich gibt es keine Möglichkeit, es zurückzukehren" = " – serhiyb

Antwort

1

Verwenden String.Split(char[], StringSplitOptions) die Zeichenfolge entlang Leerzeichen aufzuteilen:

var words = input.Split(new char[] {' ', '\t'}, StringSplitOptions.RemoveEmptyEntries); 

Wenn es irgendwelche anderen Leerzeichen in der Eingabe wie neue Zeilen (‚\ n‘), dann können Sie sie in das Trennzeichen hinzufügen Array. Wenn sich diese Liste wahrscheinlich ändert, machen Sie sie konfigurierbar.

Dann, wenn Sie wissen, welches Wort Sie wollen, und wenn das wird sich nie ändern:

if (words.Length > elementNo) result = words[elementNo]; 

Wenn das Wort auf der Liste könnte überall sein müssen Sie jedes Wort scannen, bis Sie das finden Sie wollen.

+0

es funktioniert" var words = retVal.Split (new char [] {'\ n', '\ t'}, StringSplitOptions.RemoveEmptyEntries); " –

+0

bevor Sie bearbeiten Sie antworten, es war Arbeit, nachdem Sie die Antwort bearbeiten, funktioniert es nicht –

+0

Ich benutze die erste anwaer –

0

Anstatt die gesamte Ausgabe in eine einzelne mehrzeilige Zeichenfolge zu lesen, lesen Sie Zeile für Zeile und prüfen Sie, ob Sie die gewünschte Zeile erreicht haben. Nutzt Substring() ein Spaziergang im Park, da Sie nur bis zum Ende der Zeile lesen:

Process process = new Process(); 
process.StartInfo.FileName = "cmd.exe"; 
process.StartInfo.Arguments = "/c nslookup -type=mx gmail.com"; // Note the /c command (*) 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.RedirectStandardError = true; 
process.Start(); 

string mx = ""; 
string delimiter = "mail exchanger = "; 

string outputLine; 
while ((outputLine = process.StandardOutput.ReadLine()) != null) 
{ 
    if (outputLine.Contains(delimiter)) 
     mx = outputLine.Substring(outputLine.IndexOf(delimiter) + delimiter.Length); 
} 
if (string.IsNullOrEmpty(mx)) 
    Console.WriteLine("Lookup failed"); 
else 
    Console.Write(mx); 
0

Es ist üblich, reguläre Ausdrücke für Jobs wie diese zu verwenden, so dass Sie auch etwas versuchen könnten:

// this will match anything after the last '=', before the newline 
var regex = new Regex(@"MX preference = \d+, mail exchanger = (?<server>.*)\r\n"); 

// get the first match 
var firstMatch = regex.Match(output); 

// print the captured value 
Console.WriteLine(firstMatch.Groups["server"].Value); 

es ist auch einfach mehrere Spiele zu bekommen:

// get all matches 
var matches = regex.Matches(output); 
foreach (Match m in matches) 
    Console.WriteLine(m.Groups["server"].Value); 
Verwandte Themen