使用RegEx

时间:2018-11-12 18:49:13

标签: c# regex

我正在尝试使用RegEx.Replace将字符串转换为Pascal大小写。 RegEx不是必需的,但我认为也许会更容易。这是我尝试转换的一些测试用例示例:

simple simon says       => SimpleSimonSays
SIMPLE SIMON SaYs       => SimpleSimonSays
simple_simon_says       => SimpleSimonSays
simple    simon    says => SimpleSimonSays
simpleSimonSays         => SimpleSimonSays
simple___simon___  says => SimpleSimonSays

我目前使用的方法未使用RegEx,并且可以在上述5个示例中的4个上正确使用:

internal static string GetPascalCaseName(string name)
{
    string s = System.Globalization.CultureInfo.CurrentCulture.
               TextInfo.ToTitleCase(name.ToLower()).Replace(" ", "").Replace("_", "");

    return s;
}

失败的一个示例是simpleSimonSays。当前返回Simplesimonsays而不是SimpleSimonSays。如何在所有4种情况下都可以使用此功能?

编辑

因此,基本上,如果有空格将它们分隔开或加下划线,或者每当到达大写字符时,就可以区分单词。此外,多个空格和/或多个下划线应视为一个。基本上,空格和下划线仅应被忽略,并用作下一个字母应为大写字母的信号。像这样:

simple_____simon___   says => SimpleSimonSays

3 个答案:

答案 0 :(得分:1)

我有个技巧可以解决您的问题。使用正则表达式拆分单词,并在单词中的每个单词之间引入一个空格,其中没有空格或下划线,这是驼峰式大小写(例如this simpleSimonSays)。修改您的方法,

internal static string GetPascalCaseName(string name)
{
    if (!name.Contains(" ")) {
        name = Regex.Replace(name, "(?<=[a-z])(?=[A-Z])", " ");
    }
    string s = System.Globalization.CultureInfo.CurrentCulture.
               TextInfo.ToTitleCase(name.ToLower()).Replace(" ", "").Replace("_", "");

    return s;
}

方法中的这一行,

name = Regex.Replace(name, "(?<=[a-z])(?=[A-Z])", " ");

通过在驼峰大小写词之间插入一个空格来使其分开,使它们像您在其他地方没有困难的样子。

对于此输入,

simpleSimonSays

它输出此,

SimpleSimonSays

对于其余输入,它仍然可以工作。即使您的单词驼峰大小写,也有些空格或下划线,这种策略也适用。

答案 1 :(得分:0)

如果可以使用“ abc simpleSimonSays”之类的版本,则不可能。或需要添加更多规则。或深度学习之类的东西:)
编辑:
可能的代码(但没有“ abc simpleSimonSays”):

var s = "simple__simon_says __ Hi _ _,,, __coolWa";

var s1 = Regex.Replace(s, "[ _,]+", " ");
var s2 = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s1);
var s3 = s2.Replace(" ","");

// s1 = "simple simon says Hi coolWa"
// s2 = "Simple Simon Says Hi Coolwa"
// s3 = "SimpleSimonSaysHiCoolwa"

答案 2 :(得分:0)

这是不使用正则表达式的解决方案。最后一个不能完成。

            string[] input = {
                "simple simon says",
                "SIMPLE SIMON SaYs",
                "simple_simon_says",
                "simple    simon    says",
                "simpleSimonSays"
                             };

            var temp = input.Select(x => x.Split(new char[] {' ', '_'}, StringSplitOptions.RemoveEmptyEntries).Select(y => y.Select((z,i) => (i == 0) ? z.ToString().ToUpper() : z.ToString().ToLower()))).ToArray();
            string[] output = temp.Select(x => string.Join("", x.Select(y => string.Join("",y)))).ToArray();