【发布时间】:2018-11-13 19:40:46
【问题描述】:
我正在尝试使用 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
【问题讨论】:
-
您将如何确定“simple”和“simon”以及“simon”和“says”的开始和结束位置?我认为这是真正的问题,如果每个单词之间没有确定开始/结束的单个字符串,您如何确定一个单词的结尾和另一个单词的开头以进行大小写?
-
就
simpleSimonSays这样的单个词而言,提取大小写是没有边界的。因此,除非您使用自然语言处理,否则正则表达式永远不会这样做。 -
否则,
\b([^\W_]+)(?:[ _]*([^\W_]+))*\b并在委托回调中使用捕获集合。 -
想想这样的单字场景,而不是使用 simpleSimonSays 使用
pkrltUdrXywaT -
@Ingenioushax - 我更新了我的问题。如果单词之间有空格或下划线,或者遇到大写字符(假设它是新单词的开头),则单词会被区分