2012-04-10 18 views
3

Ich habe eine einfache Textdatei (.txt), die einige Ausdrücke hat und ich möchte ungültigen Ausdruck durch ... ersetzen ... sagen wir Null.C# Regulärer Ausdruck

Ein ungültiger Ausdruck Ausdruck ist die 1+3^4^5 oder 10+3+4*5+2^5^6^7 enthält, das heißt ein Ausdruck nicht number^number^number^... enthalten kann, kann es nur number^number enthalten.

Ich verstehe, dass der beste Weg, dies zu tun ist, Regex zu verwenden, aber ich weiß nicht, wie man das in Regex schreibt.

+0

Was diese „Ausdrücke“ trennt? –

+2

Wenn Sie nicht wissen, wie man einen regulären Ausdruck schreibt, dann ist das vielleicht nicht der beste Weg. Nimm deinen Ausdruck als String und 'Split()' auf '^'. Wenn mehr als zwei Elemente zurückgegeben werden, ist Ihr Ausdruck ungültig. – Johnsyweb

+0

@Johnsyweb: Das wird nicht funktionieren für '1^2 + 3^4'. – Ryan

Antwort

7

Der reguläre Ausdruck, der mehrere Kräfte ist

(\d+\^){2,} 

({2,} bedeutet, dass zwei oder mehrere Male in einer Reihe) erkennt


lief die folgenden Test:

using System; 
using System.Text.RegularExpressions; 
namespace SampleNamespace 
{ 
    public class SampleClass 
    { 
     public static void Main() 
     { 
      string line = "1+3^4^5 10+3+4*5+2^5^6^7";    
      System.Console.WriteLine(line); 
      line = Regex.Replace(line, @"(\d+\^){2,}", "0"); 
      System.Console.WriteLine(line); 
     } 
    } 
} 

Ausgabe war:

>RegexTest.exe 
1+3^4^5 10+3+4*5+2^5^6^7 
1+05 10+3+4*5+07 

Es konnte das nachfolgende nicht ersetzen, aber es funktioniert. Sie können auf die Regex mit der folgenden Korrektur der Hinter \ d greifen:

(\d+\^){2,}\d+ 

Wenn Sie den gesamten Ausdruck tilgen wollen, die eine doppelte Leistung enthält nur verwenden

.*(\d+\^){2,}.* 

in Ihrem Ersatz ersetzen. Die .* auf beiden Seiten verschlingt die gesamte Saite, die die doppelte Leistung umgibt, wenn ein Austausch stattfindet.

+0

Das wird nicht funktionieren. '^' ist ein Sonderzeichen in regulären Ausdrücken. Entkomme es. – Ryan

+1

bereits tat ^.^ – Alain

+0

Vielen Dank für Ihre Antwort, aber wenn ich versuchte, Zeile zu ersetzen, die diesen Ausdruck enthält, hat sich nichts geändert, der Code ist 'var line = streamReader.ReadToEnd(); Zeile = Regex.Replace (Zeile, @ "(\ d + \ ^) {2,}", "0"); streamWriter.Write (line); ' – hyperN

2

Hier ist ein regulärer Ausdruck dafür:

Regex re = new Regex(@"(\d+\^){2}"); 

... 

if(re.IsMatch(myData)) { 
    // It's not valid 
} 
+0

Downvote ... Grund, jemand? – Ryan

+0

Ich weiß nicht, wer downvoted; Allerdings stimmt '{2}' nur mit 2 Wiederholungen überein. Sie sollten '{2,}' verwenden, was "zwei oder mehrere Male" bedeutet. –

+0

Kann nicht sicher sein, aber es scheint, als hätte jemand ** fälschlicherweise ** festgestellt, dass Ihr Ausdruck nicht mit einem Ausdruck mit "2^5^6^7" übereinstimmen würde (und somit nicht ablehnen würde) - aber ich ' Ich bin mir ziemlich sicher, dass es einem _string_ entsprechen würde, der das enthält, also ... vielleicht nur gehässig sein? hat mich ... - Ich werde +1 für das, was wie eine gültige Lösung für mich aussieht :) –