Domanda

Sto scrivendo un po 'di codice che deve eseguire la normalizzazione delle stringhe, voglio trasformare una determinata stringa in una rappresentazione di maiuscole / minuscole (beh, almeno per la migliore ipotesi). Esempio:

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

Penso che dovresti essere in grado di ottenere l'idea da quegli esempi. Voglio eliminare tutti i caratteri speciali (', " ;,!, ??@,., Ecc.), Scrivere in maiuscolo ogni parola (le parole sono definite da uno spazio, _ o -) e qualsiasi numeri iniziali scartati (finali / interni sono ok, ma questo requisito non è vitale, a seconda della difficoltà in realtà).

Sto cercando di capire quale sarebbe il modo migliore per raggiungere questo obiettivo. La mia prima ipotesi sarebbe con un'espressione regolare, ma le mie capacità di regex sono cattive nella migliore delle ipotesi, quindi non saprei davvero da dove cominciare.

L'altra mia idea sarebbe quella di eseguire il ciclo e analizzare i dati, dire di suddividerli in parole , analizzare ciascuno di essi e ricostruire la stringa in questo modo.

O c'è un altro modo in cui potrei farlo?

È stato utile?

Soluzione

Che ne dici di una soluzione semplice usando Strings.StrConv nello spazio dei nomi Microsoft.VisualBasic? (Non dimenticare di aggiungere un riferimento al progetto a Microsoft.VisualBasic):

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();
        }
    }
}

Altri suggerimenti

Questa regex corrisponde a tutte le parole. Quindi, Aggregate con un metodo che capitalizza i primi caratteri e ToLower è il resto della stringa.

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();
}

Questo metodo ignora i numeri, tra l'altro. Per aggiungerli, puoi modificare la regex in @ " [a-zA-Z] * | [0-9] * " , suppongo, ma non l'ho ancora testato.

Qualsiasi soluzione che prevede la corrispondenza di determinati caratteri potrebbe non funzionare bene con alcune codifiche di caratteri, in particolare se si utilizza la rappresentazione Unicode, che ha dozzine di caratteri spaziali, migliaia di "simboli", migliaia di caratteri di punteggiatura, migliaia di "lettere" , ecc. Sarebbe meglio possibile, ove possibile, utilizzare le funzioni integrate compatibili con Unicode. In termini di "carattere speciale", puoi decidere in base a Unicode categorie . Ad esempio, includerebbe "Punteggiatura" ma includerebbe "Simboli"?

ToLower (), IsLetter (), ecc. dovrebbe andare bene e prendere in considerazione tutte le possibili lettere in Unicode. La corrispondenza con trattini e barre dovrebbe probabilmente tenere conto di alcune dozzine di spazi e caratteri trattini in Unicode.

Potresti indossare pantofole color rubino per lavorare :)

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

ho pensato che sarebbe stato divertente provarlo, ecco cosa mi è venuto in mente:

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();
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top