我有以下格式的几个短语列表
thisIsAnExampleSentance
hereIsAnotherExampleWithMoreWordsInIt
我正试图以
结束This Is An Example Sentance
Here Is Another Example With More Words In It
每个短语的空格浓缩,第一个字母强制为小写。
我可以使用regex
在每个A-Z
之前添加空格,并且短语的第一个字母是大写吗?
我想做像
这样的事情([a-z]+)([A-Z])([a-z]+)([A-Z])([a-z]+) // etc
$1 $2$3 $4$5 // etc
但 50条 不同长度的 ,我的想法是一个糟糕的解决方案。有没有办法以更加动态的方式regex
?的 感谢
答案 0 :(得分:2)
我使用的Java片段如下所示(现已修订):
result = source.replaceAll("(?<=^|[a-z])([A-Z])|([A-Z])(?=[a-z])", " $1$2");
result = result.substring(0, 1).toUpperCase() + result.substring(1);
顺便说一下,这会将字符串givenProductUPCSymbol
转换为Given Product UPC Symbol
- 确保使用此类事物的方式没问题
最后,单行版本可以是:
result = source.substring(0, 1).toUpperCase() + source(1).replaceAll("(?<=^|[a-z])([A-Z])|([A-Z])(?=[a-z])", " $1$2");
此外,在类似于问题评论中给出的示例中,字符串hiMyNameIsBobAndIWantAPuppy
将更改为Hi My Name Is Bob And I Want A Puppy
答案 1 :(得分:1)
对于空间问题,如果您的语言支持零宽度后视
,则很容易var result = Regex.Replace(@"thisIsAnExampleSentanceHereIsAnotherExampleWithMoreWordsInIt", "(?<=[a-z])([A-Z])", " $1");
或者即使它不支持它们
var result2 = Regex.Replace(@"thisIsAnExampleSentanceHereIsAnotherExampleWithMoreWordsInIt", "([a-z])([A-Z])", "$1 $2");
我正在使用C#,但正则表达式应该可以在任何使用$1
... $n
支持替换的语言中使用。
但对于从小到大的情况,你无法直接在Regex中进行。您可以通过正则表达式获取第一个字符,例如:^[a-z]
,但您无法传送它。
例如在C#中你可以做到
var result4 = Regex.Replace(result, "^([a-z])", m =>
{
return m.ToString().ToUpperInvariant();
});
使用匹配评估程序更改输入字符串。
然后你甚至可以将两者融合在一起
var result4 = Regex.Replace(@"thisIsAnExampleSentanceHereIsAnotherExampleWithMoreWordsInIt", "^([a-z])|([a-z])([A-Z])", m =>
{
if (m.Groups[1].Success)
{
return m.ToString().ToUpperInvariant();
}
else
{
return m.Groups[2].ToString() + " " + m.Groups[3].ToString();
}
});
答案 2 :(得分:1)
具有unicode字符支持的Perl示例:
s/\p{Lu}/ $&/g;
s/^./\U$&/;