我正在尝试使用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
答案 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();