[英]First word from PascalCase as lowercase
我有一个包含PascalCase文本的字符串,我需要从中提取第一个单词并将其转换为小写:
assert firstWord('PmdExtension') == 'pmd'
assert firstWord('PMDExtension') == 'p'
assert firstWord('Pmd') == 'pmd'
assert firstWord('CodeQualityExtension') == 'code'
static String firstWord(String word) {
return '???'
}
让我们只关注有效的PascalCase标识符(没有任何其他字符,数字并始终以大写字母开头)。
什么是我的问题的简单和干净的解决方案?
我试过了
word.split(/[A-Z]/).first().join(' ')
但它删除了所有大写字母,而我需要保留它们。
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) }
}
就像是:
static String firstWord(String word) {
return word[0].toLowerCase()+word.split(['A'..'Z'].join('|'))[1]
}
Groovy查找运算符( =~
)似乎很好地完成了这项工作:
static String firstWord(String word) {
word ? (word =~ /[A-Z][a-z]*/)[0].toLowerCase() : ''
}
inject
方法可用于累积字符,直到遇到第二个大写字母:
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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.