2016-09-29 1 views
5

Ich habe eine Probe Zeichenfolge '((1/1000)*2375.50)'.NET REGEX Get Integer NUR GANZ DECIMAL ausschließen

Ich möchte die 1 und 1000 erhalten, die ein INT ist

ich diesen REGEX Ausdruck versucht:

  • -?\d+(\.\d+)? => dies entspricht 1, 1000, and 2375.50
  • -?\d+(?!(\.|\d+)) => diese 1, 1000, and 50 Spiele
  • -?\d+(?!\.\d+&(?![.]+[0-9]))? =>1, 1000, 2375, and 50

Welche Ausdruck muss ich passen verwenden (1 and 1000)?

+0

Sind alle Ihre Eingabezeichenfolgen im Format '((x/y) * z)'? – Chrono

+1

@Chrono: Nein, das war nur eine Beispielzeichenfolge. Jede Zeichenfolge würde –

Antwort

4

Also im Grunde brauchen Sie Ziffernfolgen entsprechen, die durch einen Punkt oder eine andere Ziffer nicht vor- oder nachgeschaltet werden? Warum versuchst du das nicht einfach?

[TestCase("'((1/1000)*2375.50)'", new string[] { "1", "1000" })] 
[TestCase("1", new string[] { "1" })] 
[TestCase("1 2", new string[] { "1", "2" })] 
[TestCase("123 345", new string[] { "123", "345" })] 
[TestCase("123 3.5 345", new string[] { "123", "345" })] 
[TestCase("123 3. 345", new string[] { "123", "345" })] 
[TestCase("123 .5 345", new string[] { "123", "345" })] 
[TestCase(".5-1", new string[] { "-1" })] 
[TestCase("0.5-1", new string[] { "-1" })] 
[TestCase("3.-1", new string[] { "-1" })] 
public void Regex(string input, string[] expected) 
{ 
    Regex regex = new Regex(@"(?:(?<![.\d])|-)\d+(?![.\d])"); 
    Assert.That(regex.Matches(input) 
      .Cast<Match>() 
      .Select(m => m.ToString()) 
      .ToArray(), 
     Is.EqualTo(expected)); 
} 

scheint zu funktionieren.

+0

Ihr Muster funktioniert wie ein Charme, funktioniert auf jedem STRING –

+0

@Bienvenido, na ja, vor allem, Es ist kein Grund zu SCREAM. Und eine andere Sache, wie Kobi bemerkte, ich habe das Minuszeichen total vergessen. Siehe meine Bearbeitung. –

1

Try this:

string pattern = @"\(\(([\d]+)\/([\d]+)\)\*"; 
    string input = @"'((1/1000)*2375.50)'"; 


    foreach (Match match in Regex.Matches(input, pattern)) 
    { 
    Console.WriteLine("{0}", match.Groups[1].Value); 
    Console.WriteLine("{0}", match.Groups[2].Value); 

    }   
+0

Tahnks für die Antwort tun. Ich versuchte es, aber das Muster entspricht '((1/1000) *' Ich will nur 1 und 1000 –

+0

können Sie jetzt versuchen –

3

Sie verwenden können:

(?<!\.)-?\b\d+\b(?!\.) 

Working example

  • (?<!\.) - Keine Zeit vor der Zahl.
  • -? - Optionales Minuszeichen
  • \b\d+\b - Die Nummer. Eingeschlossen in eine Wortgrenze, wird es nicht möglich sein, mit einer anderen Zahl übereinzustimmen (z. B. stimmen Sie nicht mit 1234 in 12345.6 überein). Dies passt nicht zu 2 in 2pi.
  • (?!\.) - Keine Periode nach der Nummer.
+0

Besser als meine, weil Sie das Minuszeichen und die ganzen Zahlen möglicherweise als Teil eines Identifikators haben. –

+0

@ SergeyTachenov - Danke! Das Minus ist ein Teil der Frage (alle Muster beginnen mit '-?'). Das '2pi' Ding könnte ein Fehler in meinem Muster sein, wir könnten diese ganzen Zahlen abgleichen. – Kobi

+1

Ah, ich habe das Minus verpasst in der Frage. Das jetzt behoben. Übrigens, Sie haben hier einen Fehler mit diesem Minus. In einer Zeichenkette wie '" 3.-1 "', werden Sie nicht "-1" zuordnen. –