首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在大写字母前添加空格

在大写字母前添加空格
EN

Stack Overflow用户
提问于 2008-11-07 16:33:54
回答 25查看 106.1K关注 0票数 211

给定字符串"ThisStringHasNoSpacesButItDoesHaveCapitals“,在大写字母前添加空格的最佳方式是什么?所以最后的字符串应该是"This string Has No Spaces But It So Capitals“

这是我对RegEx的尝试

代码语言:javascript
复制
System.Text.RegularExpressions.Regex.Replace(value, "[A-Z]", " $0")
EN

回答 25

Stack Overflow用户

发布于 2011-02-17 04:10:35

没有测试性能,但在linq中有一行:

代码语言:javascript
复制
var val = "ThisIsAStringToTest";
val = string.Concat(val.Select(x => Char.IsUpper(x) ? " " + x : x.ToString())).TrimStart(' ');
票数 92
EN

Stack Overflow用户

发布于 2013-09-27 21:31:54

我知道这是一个旧的扩展,但这是我在需要时使用的扩展:

代码语言:javascript
复制
public static class Extensions
{
    public static string ToSentence( this string Input )
    {
        return new string(Input.SelectMany((c, i) => i > 0 && char.IsUpper(c) ? new[] { ' ', c } : new[] { c }).ToArray());
    }
}

这将允许您使用MyCasedString.ToSentence()

票数 22
EN

Stack Overflow用户

发布于 2012-10-05 01:33:06

我打算基于Binary Worrier的代码做一个简单的扩展方法,它可以正确地处理首字母缩写,并且是可重复的(不会破坏已经间隔的单词)。这是我的结果。

代码语言:javascript
复制
public static string UnPascalCase(this string text)
{
    if (string.IsNullOrWhiteSpace(text))
        return "";
    var newText = new StringBuilder(text.Length * 2);
    newText.Append(text[0]);
    for (int i = 1; i < text.Length; i++)
    {
        var currentUpper = char.IsUpper(text[i]);
        var prevUpper = char.IsUpper(text[i - 1]);
        var nextUpper = (text.Length > i + 1) ? char.IsUpper(text[i + 1]) || char.IsWhiteSpace(text[i + 1]): prevUpper;
        var spaceExists = char.IsWhiteSpace(text[i - 1]);
        if (currentUpper && !spaceExists && (!nextUpper || !prevUpper))
                newText.Append(' ');
        newText.Append(text[i]);
    }
    return newText.ToString();
}

下面是这个函数通过的单元测试用例。我把tchrist建议的大多数案例都添加到了这个列表中。它没有通过的三个参数(两个只是罗马数字)被注释掉了:

代码语言:javascript
复制
Assert.AreEqual("For You And I", "ForYouAndI".UnPascalCase());
Assert.AreEqual("For You And The FBI", "ForYouAndTheFBI".UnPascalCase());
Assert.AreEqual("A Man A Plan A Canal Panama", "AManAPlanACanalPanama".UnPascalCase());
Assert.AreEqual("DNS Server", "DNSServer".UnPascalCase());
Assert.AreEqual("For You And I", "For You And I".UnPascalCase());
Assert.AreEqual("Mount Mᶜ Kinley National Park", "MountMᶜKinleyNationalPark".UnPascalCase());
Assert.AreEqual("El Álamo Tejano", "ElÁlamoTejano".UnPascalCase());
Assert.AreEqual("The Ævar Arnfjörð Bjarmason", "TheÆvarArnfjörðBjarmason".UnPascalCase());
Assert.AreEqual("Il Caffè Macchiato", "IlCaffèMacchiato".UnPascalCase());
//Assert.AreEqual("Mister Dženan Ljubović", "MisterDženanLjubović".UnPascalCase());
//Assert.AreEqual("Ole King Henry Ⅷ", "OleKingHenryⅧ".UnPascalCase());
//Assert.AreEqual("Carlos Ⅴº El Emperador", "CarlosⅤºElEmperador".UnPascalCase());
Assert.AreEqual("For You And The FBI", "For You And The FBI".UnPascalCase());
Assert.AreEqual("A Man A Plan A Canal Panama", "A Man A Plan A Canal Panama".UnPascalCase());
Assert.AreEqual("DNS Server", "DNS Server".UnPascalCase());
Assert.AreEqual("Mount Mᶜ Kinley National Park", "Mount Mᶜ Kinley National Park".UnPascalCase());
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/272633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档