2010-12-16 16 views
0

Wie den numerischen Wert aus der folgenden Zeichenkette erhalten regulären AusdruckRegular Expression

AD .6547 BNM 

Das Ergebnis sollte

sein, mir
.6547 

Bitte helfen Sie diesen

Vielen Dank im Voraus zu tun

+0

'Regex EX = neue Regex (" ( [0-9.] *) "); Übereinstimmung M = EX.Match ("AD. 6547 BNM"); String str = M.Groups ["Z"]. Value; ' Aber es funktioniert nicht –

+1

Kann es auch Werte geben wie' 1.234', '1.2E34',' -0.123', '123.456.789' oder' 123.' ? –

Antwort

3

Ich würde in der Regel für Regex.Match beginnen zu beginnen. Sie erhalten einen kleinen Vorteil, wenn Sie ein Regex-Objekt instanziieren und die Methode der Übereinstimmungsinstanz verwenden, anstatt die statische Match-Methode zu verwenden, wenn Sie mehrere zu analysierende Strings haben. Es ist nur ein kleiner Vorteil, aber hey ...

Wenn Sie erhebliche Leistungsbedenken haben und das Format Ihrer Eingabe-Strings statisch sind, könnten Sie sogar in Erwägung ziehen, Regex zugunsten von String.Substring oder gar string.Split aufzugeben. Ihre Frage veranlasste mich, die Leistungsunterschiede zwischen ein paar verschiedenen Methoden, Code unten, zu messen.

static void TestParse() 
    { 
     List<string> strList = new List<string> 
     { 
      "AD .1234 BNM", 
      "AD .6547 BNM", 
      "AD .6557 BNM", 
      "AD .6567 BNM", 
      "AD .6577 BNM", 
      "AD .6587 BNM", 
      "AD .6597 BNM", 
      "AD .6540 BNM", 
      "AD .6541 BNM", 
      "AD .6542 BNM" 
     }; 

     Stopwatch stopwatch = new Stopwatch(); 
     string result = ""; 
     stopwatch.Start(); 
     for (int i=0; i<100000; i++) 
      foreach (string str in strList) 
      { 
       var match = Regex.Match(str, @"(\.\d+)"); 
       if (match.Success) 
        result = match.Groups[1].Value; 
      } 
     stopwatch.Stop(); 
     Console.WriteLine("\nTotal Regex.Match time 1000000 parses: {0}", stopwatch.ElapsedMilliseconds); 

     result = ""; 
     stopwatch.Reset(); 
     stopwatch.Start(); 
     Regex exp = new Regex(@"(\.\d+)", RegexOptions.IgnoreCase); 
     for (int i = 0; i < 100000; i++) 
      foreach (string str in strList) 
       result = exp.Matches(str)[0].Value; 
     stopwatch.Stop(); 
     Console.WriteLine("Total Regex object time 1000000 parses: {0}", stopwatch.ElapsedMilliseconds); 

     result = ""; 
     stopwatch.Reset(); 
     stopwatch.Start(); 
     for (int i = 0; i < 100000; i++) 
      foreach (string str in strList) 
       result = str.Substring(4, 5); 
     stopwatch.Stop(); 
     Console.WriteLine("Total string.Substring time 1000000 parses: {0}", stopwatch.ElapsedMilliseconds); 

     result = ""; 
     stopwatch.Reset(); 
     stopwatch.Start(); 
     char[] seps = { ' ' }; 
     for (int i = 0; i < 100000; i++) 
      foreach (string str in strList) 
       result = str.Split(seps, StringSplitOptions.RemoveEmptyEntries)[1]; 
     stopwatch.Stop(); 
     Console.WriteLine("Total string.Split time 1000000 parses: {0}", stopwatch.ElapsedMilliseconds); 
    } 
3
var src = "AD .6547 BNM"; 

var match = Regex.Match(input, @"(\.\d+)"); 
if (match.Success) { 
    var result = match.Groups[1].Value; 
} 
+0

var in C# wirklich? – RageZ

+0

@RageZ: Ja. Aber es ist immer noch stark typisiert, da csc.exe auf der Kompilierungsstufe entscheidet, welcher tatsächliche Typ die Variable ist. In IL erhalten Sie den spezifischen Typ. – zerkms

+0

@RageZ: Ja, es ist ein Schlüsselwort für faule Entwickler, das Quellen auch lesbarer macht: 'var dict = new Dictionary ();' vs 'Dictionary dict = new Dictionary (); ';-) – zerkms

2
\.\d+ 

sollte es tun und einige C# -Code:

Regex exp = new Regex(
    @"(\.\d+)", 
    RegexOptions.IgnoreCase); 

string InputText = "AD .1234"; 
MatchCollection MatchList = exp.Matches(InputText); 
Match FirstMatch = MatchList[0]; 
string value = MatchList[0].value; 
1

versuchen

\.\d* 

es wird wählen Sie "" und alle Ziffern danach.

+0

es wird auch jeder dot 'foobar passen. Baz '- so – zerkms