2011-12-13 8 views
7

Mam listę słów, które muszą być czytelne dla człowieka, takie jak imię od imienia, nazwisko od nazwiska, aw niektórych przypadkach akronimy takie jak ARB, aby pozostały bez zmian. Ta ostatnia została niedawno wprowadzona i spowodowała problem z wyświetlaniem, ponieważ nasze wyrażenie regularne zwraca AR Bs. Oto, co mamy, co wiem, jest niewystarczający dla akronimów:Podziel ciąg PascalCase, z wyjątkiem akronimów

([A-Z][a-z]+) 

Znalazłem innych wyrażeń na SO i na innych stronach, które są w stanie pracować z akronimów, jednak działają one na łańcuchach, gdzie skrót jest w zasięgu ciąg, a nie cały ciąg. Potrafię wykonywać proste wyrażenia regularne, ale jest to zbyt skomplikowane, jeśli chodzi o moje umiejętności. Dostarczyłbym innych przykładów do testowania, gdybym je miał, ale wszystkie ciągi działają poprawnie, z wyjątkiem nowego, ARB. Dziękuję Ci.

Aktualizacja: Oto użycie kodu

string friendlyName = Regex.Replace(field.Name, "([A-Z][a-z]+)", " $1", RegexOptions.Compiled).Trim(); 
+0

Niestety problem ten może skończyć się z nierozwiązanym niejednoznaczności, na przykład nie 'ConfigureIDEAsUser' podzielić na„Configure IDE jako użytkownik”lub„Konfiguracja użytkownika”pomysły? –

Odpowiedz

12

Would not [A-Z]+[a-z]* zrobić? To powinno pasować do jednej lub większej liczby wielkich liter, po których następuje zero lub więcej małych liter. Tak więc ARBs pozostanie pojedynczą jednostką, ale CamelCase zostanie podzielona na Camel Case.

+0

Nie mogę uwierzyć, że to było takie proste ... dziękuję !! – Mathachew

+0

Świetne rozwiązanie. Czy istnieje sposób, aby "HereIsGPSData" było "Tutaj są dane GPS"? Widzę, gdzie byłoby to trudne. Ale przypuszczam, że jeśli istnieje wielka litera po zestawie wielkich liter, ostatnia górna nie jest częścią akronimu. – Grandizer

+1

Właściwie to rozgryzłem. Użyj (? Grandizer

0

Ciąg/akapit/zdanie, w tym akronimy, można konwertować na zdania/ciągi czytelne dla człowieka. Próbowałem po prostu do formatowania ciągu Pascal Cased, zbadałem więcej i próbowałem nawet konwertować akronimy w formacie zrozumiałym.

testowania danych:

Wejście: "QWERTYSomeThing OmitTRYSomeThing MayBeWorkingFYI"

wyjściowa: "QWERTY Niektóre Thing Omit spróbować rzecz może pracować FYI"

Kod: Podaj ciąg wejściowy do metody podanej poniżej.

private static string FormatPascalAndAcronym(string input) 
    { 
     var builder = new StringBuilder(input[0].ToString()); 
     if (builder.Length > 0) 
     { 
      for (var index = 1; index < input.Length; index++) 
      { 
       char prevChar = input[index - 1]; 
       char nextChar = index + 1 < input.Length ? input[index + 1] : '\0'; 

       bool isNextLower = Char.IsLower(nextChar); 
       bool isNextUpper = Char.IsUpper(nextChar); 
       bool isPresentUpper = Char.IsUpper(input[index]); 
       bool isPrevLower = Char.IsLower(prevChar); 
       bool isPrevUpper = Char.IsUpper(prevChar); 

       if(!string.IsNullOrWhiteSpace(prevChar.ToString()) && 
        ((isPrevUpper&& isPresentUpper && isNextLower) || 
        (isPrevLower&&isPresentUpper&&isNextLower)|| 
        (isPrevLower&&isPresentUpper&&isNextUpper))) 
       { 
        builder.Append(' '); 
        builder.Append(input[index]); 
       } 
       else{ 
       builder.Append(input[index]); 
       } 
      } 
     } 
     return builder.ToString(); 
    } 
+0

To nie działa w przypadku jedynego przypadku testowego wymienionego w pytaniu. Chociaż jest to prawdopodobnie odpowiednia zasada dla wszystkich pozostałych. –