2016-08-26 1 views
3

J'ai une chaîne qui contient du texte dans PascalCase et je dois extraire premier mot et le convertir en minuscules:Le premier mot de PascalCase en minuscules

assert firstWord('PmdExtension') == 'pmd' 
assert firstWord('PMDExtension') == 'p' 
assert firstWord('Pmd') == 'pmd' 
assert firstWord('CodeQualityExtension') == 'code' 

static String firstWord(String word) { 
    return '???' 
} 

Concentrons uniquement sur les identifiants de PascalCase valides (sans autres caractères, chiffres et toujours en commençant par la lettre majuscule).

Quelle serait la solution simple et propre à mon problème?

J'ai essayé

word.split(/[A-Z]/).first().join(' ') 

mais il supprime toutes les lettres en majuscules, alors que je dois les conserver.

+0

Qu'avez-vous essayé? Cela ressemble à une question "s'il vous plaît écrivez le code pour moi" (par opposition à "s'il vous plaît aidez-moi avec ce problème"). –

+0

@MichaelEaster J'ai modifié la question et ajouté des informations sur ce que j'ai essayé –

+0

Comme vous le dites, la scission supprime les majuscules, puis il suffit de l'ajouter à nouveau, car vous avez encore besoin de le convertir –

Répondre

2

Quelque chose comme:

static String firstWord(String word) { 
    return word[0].toLowerCase()+word.split(['A'..'Z'].join('|'))[1] 
} 
1

La méthode inject peut être utilisé pour accumuler des caractères jusqu'à la deuxième lettre majuscule est rencontré:

def firstWord(String word) { 
    def numCapsObserved = 0 
    def initVal = "" 

    word.inject(initVal, { val, letter -> 
     def result = val 
     if (letter ==~ /[A-Z]/) { numCapsObserved++ } 

     if (numCapsObserved < 2) { 
      result += letter.toLowerCase() 
     } 
     return result 
    }) 
} 

assert firstWord('PmdExtension') == 'pmd' 
assert firstWord('PMDExtension') == 'p' 
assert firstWord('Pmd') == 'pmd' 
assert firstWord('CodeQualityExtension') == 'code' 
3
assert firstWord('PmdExtension') == 'pmd' 
assert firstWord('PMDExtension') == 'p' 
assert firstWord('Pmd') == 'pmd' 
assert firstWord('CodeQualityExtension') == 'code' 
assert firstWord('') == '' 
assert firstWord(null) == '' 

static String firstWord(String word) { 
    word ? word.split(/(?=\p{Lu})/)[0].toLowerCase() : '' 

    // A verbose way would be as below (omitting the null check for brevity) 
    // word[0].toLowerCase() + word[1..-1].takeWhile { Character.isLowerCase(it) } 
} 
2

L'opérateur trouve Groovy (=~) semble faire le travail bien:

static String firstWord(String word) { 
    word ? (word =~ /[A-Z][a-z]*/)[0].toLowerCase() : '' 
} 
+0

Si la personne qui m'a déprécié prendrait soin d'exprimer la raison ici, je serais toujours si reconnaissant. – BalRog