501 Stimmen

Effiziente Weise zu entfernen ALLE Leerzeichen aus String?

Ich rufe eine REST-API auf und erhalte eine XML-Antwort zurück. Sie gibt eine Liste von Arbeitsbereichsnamen zurück, und ich schreibe eine schnelle IsExistingWorkspace() Methode. Da alle Arbeitsbereiche aus zusammenhängenden Zeichen ohne Leerzeichen bestehen, nehme ich an, dass der einfachste Weg, um herauszufinden, ob ein bestimmter Arbeitsbereich in der Liste enthalten ist, darin besteht, alle Leerzeichen (einschließlich Zeilenumbrüche) zu entfernen und dies zu tun (XML ist die Zeichenkette, die von der Webanforderung empfangen wird):

XML.Contains("<name>" + workspaceName + "</name>");

Ich weiß, dass zwischen Groß- und Kleinschreibung unterschieden wird, und darauf verlasse ich mich. Ich brauche nur eine Möglichkeit, alle Leerzeichen in einer Zeichenfolge effizient zu entfernen. Ich weiß, RegEx und LINQ kann es tun, aber ich bin offen für andere Ideen. Ich bin vor allem nur über die Geschwindigkeit besorgt.

7 Stimmen

Das Parsen von XML mit Regex ist fast so schlimm wie Parsen von HTML mit Regex .

3 Stimmen

@henk holterman; Siehe meine Antwort unten, regexp scheint nicht in allen Fällen die schnellste zu sein.

0 Stimmen

Regex scheint nicht der schnellste zu sein. Ich habe die Ergebnisse vieler verschiedener Methoden zum Entfernen von Leerzeichen aus einer Zeichenkette zusammengefasst. Die Zusammenfassung ist in einer Antwort unten - stackoverflow.com/a/37347881/582061

1voto

J S Punkte 185

Die einfache Art und Weise, alle Leerzeichen aus einer Zeichenkette zu entfernen, "Beispiel" ist Ihre Ausgangszeichenkette.

String.Concat(example.Where(c => !Char.IsWhiteSpace(c))

1voto

Fred Punkte 607

Hier ist noch eine weitere Variante:

public static string RemoveAllWhitespace(string aString)
{
  return String.Join(String.Empty, aString.Where(aChar => aChar !Char.IsWhiteSpace(aChar)));
}

Wie bei den meisten anderen Lösungen habe ich keine ausführlichen Benchmark-Tests durchgeführt, aber für meine Zwecke ist diese Lösung gut genug.

0voto

hvanbrug Punkte 1291

Ich habe unterschiedliche Ergebnisse gefunden, die der Wahrheit entsprechen. Ich versuche, alle Leerzeichen durch ein einzelnes Leerzeichen zu ersetzen, und die Regex war extrem langsam.

return( Regex::Replace( text, L"\s+", L" " ) );

Was für mich am besten funktionierte (in C++ cli) war:

String^ ReduceWhitespace( String^ text )
{
  String^ newText;
  bool    inWhitespace = false;
  Int32   posStart = 0;
  Int32   pos      = 0;
  for( pos = 0; pos < text->Length; ++pos )
  {
    wchar_t cc = text[pos];
    if( Char::IsWhiteSpace( cc ) )
    {
      if( !inWhitespace )
      {
        if( pos > posStart ) newText += text->Substring( posStart, pos - posStart );
        inWhitespace = true;
        newText += L' ';
      }
      posStart = pos + 1;
    }
    else
    {
      if( inWhitespace )
      {
        inWhitespace = false;
        posStart = pos;
      }
    }
  }

  if( pos > posStart ) newText += text->Substring( posStart, pos - posStart );

  return( newText );
}

Ich habe die obige Routine zunächst ausprobiert, indem ich jedes Zeichen einzeln ersetzt habe, musste dann aber für die Abschnitte ohne Leerzeichen zu Teilstrings wechseln. Bei der Anwendung auf eine Zeichenkette mit 1.200.000 Zeichen:

  • Mit der obigen Routine ist das in 25 Sekunden erledigt.
  • die obige Routine + Ersetzung einzelner Zeichen in 95 Sekunden
  • der Regex wurde nach 15 Minuten abgebrochen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X