正则表达式我怎么能分开这个词?

时间:2012-03-15 19:31:44

标签: regex

我有以下格式的几个短语列表

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?的 感谢

3 个答案:

答案 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$&/;