2009-07-10 10 views
2

Ich versuche, einige dubiose XML-Attribute mit Regulären Ausdrücken zu bereinigen.C# Regex Ersetzen, aber nur eine nummerierte Untergruppe ersetzen

Meine Eingabezeichenfolge ist diese

<TD X:NUM class=xl101P24_2>I Want to send a FAX:but not </TD> 

Meine beabsichtigte Ausgabezeichenfolge ist diese

<TD class=xl101P24_2>I Want to send a FAX:but not </TD> 

jetzt Ihr Code wie dieser so

public static Regex regex1 = new Regex(
     "<\\w*\\s*(X:\\w*)", 
    RegexOptions.IgnoreCase 
    | RegexOptions.CultureInvariant 
    | RegexOptions.IgnorePatternWhitespace 
    | RegexOptions.Compiled 
    ); 

public void doRegex() 
{ 
    string InputText = @"<TD X:NUM class=xl101P24_2>I Want to send a FAX:but not </TD>"; 

    string result = regex1.Replace(InputText,""); 

    //result now = " class=xl101P24_2>I Want to send a FAX:but not </TD>" 
} 

sieht Ich brauche das ersetzen zu tun, aber nur das nummerierte Sub-Match ersetzen wollen, dh das 'X: NUM'. Wie mache ich das???

Michael

Antwort

5

Sie sollten einen Vorgriff Konstrukt verwenden (Spiel Präfix aber ausschließen es). Auf diese Weise ist der erste Teil (der „<TD“ Teil) nicht angepasst werden und auch nicht ersetzt:

"(?<=<\\w*)\\s*(X:\\w*)" 
+0

fantastisch, das ist es. Für ref ist das letzte Muster "(? <= <\\ w * \\ s *) (X: \\ w *)" –

-1

Hier ist der regex Weg ist, es zu tun. warum fragt, nicht Sie machen das, indem es XSL oder XML-Parsing (Entfernen Attribut ") :-)

public static Regex regex1 = new Regex("^<\\w*\\s*td\\w*\\s*(X:\\w*)", 
RegexOptions.IgnoreCase 
| RegexOptions.CultureInvariant 
| RegexOptions.IgnorePatternWhitespace 
| RegexOptions.Compiled 
); 


or "^<\\w*\\s*td\\w*\\s*(X:\\w*)" 
+0

Ich kann das XML-Parsing nicht verwenden, weil das Attribut nicht gut gebildet ist. Ich versuche, den stopid rohen Text aufzuräumen, damit ich es als XML analysieren kann. –

2

Einen anderen Weg, dies zu acheive ist eine Ersatzzeichenfolge zu verwenden, um das ganze Spiel nur mit der ersten Gruppe zu ersetzen, die zweiten ignoriert Gruppe mit dem Mist.

string sResult = Regex.Replace(sInput, @"(<\w*\s*)(X:\w*\s*)", "$1") 

Dies keine Look-aheads benötigt und sollte so sein, schneller (ein einfacher Durchlauf zeigte, dass es eine Größenordnung schneller sein).

die Regex ändern a haben + nachdem die zweite Gruppe alle X: Attribute entfernt hat, nicht nur die erste (wenn dies relevant ist).

string sResult = Regex.Replace(sInput, @"(<\w*\s*)(X:\w*\s*)+", "$1")