Frage

ich einige Code ich schreibe die Zeichenfolge Normalisierung tun muss, ich will eine bestimmte Zeichenkette in einem Kamel-Fall Darstellung drehen (na ja, auf die beste Vermutung zumindest). Beispiel:

"the quick brown fox" => "TheQuickBrownFox"
"the_quick_brown_fox" => "TheQuickBrownFox"
"123The_quIck bROWN FOX" => "TheQuickBrownFox"
"the_quick brown fox 123" => "TheQuickBrownFox123"
"thequickbrownfox" => "Thequickbrownfox"

Ich denke, man sollte auf die Idee kommen aus diesen Beispielen kann. Ich möchte Streifen aus alle besondere Zeichen, Kapital jedes Wort (Wörter durch ein Leerzeichen definiert sind, _ oder -) (‘,“,, @, usw.!.) Und alle leading Zahlen fiel (Hinter / innen sind in Ordnung, aber diese Anforderung nicht von entscheidender Bedeutung ist, auf der Schwierigkeit je wirklich).

Ich versuche, herauszufinden, was der beste Weg, um dies zu erreichen wäre. Meine erste Vermutung mit einem regulären Ausdruck sein würde, aber meine regex Fähigkeiten sind bestenfalls schlecht, damit ich nicht wirklich wissen würde, wo ich anfangen soll.

Meine andere Idee Schleife sein würde und die Daten analysieren, sagen Sie es brechen in Wörter , von denen jeder analysieren, und die Zeichenfolge, die Art und Weise wieder aufgebaut.

Oder gibt es eine andere Art und Weise, in der ich es gehen könnte?

War es hilfreich?

Lösung

Wie wäre es eine einfache Lösung mit Strings.StrConv im Microsoft.VisualBasic Namespace? (Vergessen Sie nicht, einen Projektverweis auf Microsoft.VisualBasic hinzufügen):

using System;
using VB = Microsoft.VisualBasic;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(VB.Strings.StrConv("QUICK BROWN", VB.VbStrConv.ProperCase, 0));
            Console.ReadLine();
        }
    }
}

Andere Tipps

Diese Regex passt zu allen Wörtern. Dann wir Aggregate sie mit einem Verfahren, das die ersten Zeichen darstellen, und ToLowers den Rest des Strings.

Regex regex = new Regex(@"[a-zA-Z]*", RegexOptions.Compiled);

private string CamelCase(string str)
{
    return regex.Matches(str).OfType<Match>().Aggregate("", (s, match) => s + CamelWord(match.Value));
}

private string CamelWord(string word)
{
    if (string.IsNullOrEmpty(word))
        return "";

    return char.ToUpper(word[0]) + word.Substring(1).ToLower();
}

Diese Methode ignoriert Zahlen, nebenbei bemerkt. So fügen sie, können Sie die Regex ändern @"[a-zA-Z]*|[0-9]*", nehme ich an - aber ich habe es nicht getestet

.

Jede Lösung, die bestimmten Zeichen beinhaltet die passenden möglicherweise nicht gut mit einigen Zeichenkodierungen, insbesondere dann, wenn Unicode-Darstellung verwendet wird, die Dutzende von Leerzeichen, Tausende von ‚Symbolen‘, Tausende von Satzzeichen, Tausende von ‚Buchstaben‘ hat usw. Es wäre besser, wo immer möglich zu verwenden integrierte in Unicode-aware Funktionen. Im Hinblick darauf, was ist ein ‚Sonderzeichen‘, auch Sie basiert auf Unicode entscheiden konnte, Kategorien . Zum Beispiel wäre es ‚Interpunktion‘ gehört aber wäre es gehört ‚Symbole‘?

ToLower (), IsLetter () sollte usw. in Ordnung sein, und berücksichtigt alle möglichen Buchstaben in Unicode. Matching gegen Striche und Schrägstriche sollten wahrscheinlich berücksichtigen einige der Dutzende von Raum und Bindestriche in Unicode.

Sie könnten Ruby Slipper tragen arbeiten :)

def camelize str
  str.gsub(/^[^a-zA-z]*/, '').split(/[^a-zA-Z0-9]/).map(&:capitalize).join
end

dachte, es würde Spaß machen, es zu versuchen, hier ist, was ich kam mit:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            string sentence = "123The_quIck bROWN FOX1234";

            sentence = sentence.ToLower();

            char[] s = sentence.ToCharArray();

            bool atStart = true;
            char pChar = ' ';

            char[] spaces = { ' ', '_', '-' };
            char a;
            foreach (char c in s)
            {
                if (atStart && char.IsDigit(c)) continue;

                if (char.IsLetter(c))
                {
                    a = c;
                    if (spaces.Contains(pChar))
                        a = char.ToUpper(a);
                    sb.Append(a);
                    atStart = false;
                }
                else if(char.IsDigit(c))
                {
                    sb.Append(c);
                }
                pChar = c;
            }

            Console.WriteLine(sb.ToString());
            Console.ReadLine();
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top