2016-04-04 4 views
1

Ich habe nicht festgestellt, warum der Versuch, eine negierte Zeichenklasse mit Regex zu verwenden. Replace ersetzt keine Zeilenumbrüche durch ein Leerzeichen.C# - Regex.Replace - Ich kann nicht herausfinden, warum Newline nicht ersetzt wird

Hier ist ein Beispielcode:

namespace ConsoleApplication1 
{ 
    class Program 
     { 
     static void Main(string[] args) 
      { 

      string testInput = "This is a test. \n This is a newline. \n this is another newline. This is a, comma"; 



      Console.WriteLine(testInput); 


      //get rid of line breaks and other letters not allowed 
      string commentFix = Regex.Replace(testInput, @"[^A-Z\sa-z\.0-9\-\:\;\$]", " "); 
      commentFix = "\"" + commentFix + "\""; 


      Console.WriteLine("\n"); 

      Console.WriteLine(commentFix); 
      Console.ReadLine(); 


      } 
     } 
} 

Der Ausgang dieses ist:

This is a test. 
This is a newline. 
this is another newline. This is a, comma 

"This is a test. 
This is a newline. 
this is another newline. This is a comma" 

Irgendwelche Ideen? (Danke, das ist meine erste Frage!)

+0

Sie haben nichts in Ihrem Muster, das mit Newline übereinstimmt. Siehe meinen Beitrag hier: http://stackoverflow.com/questions/28743851/regular-expression-to-match-any-vertical-whitespace –

+0

Einfach tun: Regex.Replace (testInput, @ "\ n +", ""); – Quinn

Antwort

3

Die \s entspricht einer Newline, und da es in einem negated character class ist, werden Zeilenumbrüche nicht entfernt.

Weitere details on what \s matched at MSDN:

\f - Der Formularvorschub Charakter, \u000C.
\n - Das Zeilenvorschubzeichen, \u000A.
\r - Das Wagenrücklaufzeichen, \u000D.
\t - Das Tab-Zeichen, \u0009.
\v - Die vertikale Registerkarte Zeichen, \u000B.
\x85 - Die Ellipse oder NEXT LINE (NEL) -Zeichen (...), \u0085.
\p{Z} - Entspricht einem beliebigen Trennzeichen.

Also, wenn Sie Leerzeichen entfernen möchten, nehmen Sie nur \s (und ich denke, man mehrere Charaktere abgestimmt mit einem Leerzeichen ersetzen müssen, fügen Sie + dass ein oder mehrere Vorkommen des Musters entsprechen, werden sie quantifiziert):

[^A-Za-z.0-9:;$-]+ 

Siehe regex demo

beachten Sie auch, dass Sie nicht . entkommen müssen, : , ; und $ innerhalb einer Zeichenklasse, und Sie müssen nicht - entkommen, wenn es am Anfang/Ende der Zeichenklasse steht.

Wenn Sie Leerzeichen mit Ausnahme von CR und LF entsprechen möchten, verwenden Sie [^\S\r\n]: [^A-Z\S\r\na-z.0-9:;$-]+. Hier entspricht [^\S] einem Leerzeichen, aber \r\n sind innerhalb der Klasse negierter Zeichen, so dass sie nicht übereinstimmen.

+1

Danke. Ich habe vergessen, das + am Ende meines Beispiels hinzuzufügen. Ich glaube, ich habe meist nicht verstanden, dass \ s \ r \ n enthalten ist. Ich benutze reguläre Ausdrücke ständig in einer Programmsuite namens "Laserfiche", aber anscheinend ändern sie absichtlich ihre Musterübereinstimmungen, um nicht über Zeilenumbrüche hinwegzugehen, es sei denn, Sie sagen es ihnen ausdrücklich.Also muss ich mich von der Gewohnheit, \ s zu verwenden, jederzeit verabschieden, ich möchte einfach ein Leerzeichen und/oder einen Tab und benutze stattdessen [\ t]. –

Verwandte Themen