这是一个正则表达式解决方案,它使用标点符号类别来避免必须指定 .!?” 等,尽管您当然应该检查它是否满足您的需求或明确设置它们。阅读“支持”下的“P”类别Unicode 通用类别”部分位于 MSDN Character Classes page。
string input = @"this is some code. the code is in C#? it's great! In ""quotes."" after quotes.";
string pattern = @"(^|\p{P}\s+)(\w+)";
// compiled for performance (might want to benchmark it for your loop)
Regex rx = new Regex(pattern, RegexOptions.Compiled);
string result = rx.Replace(input, m => m.Groups[1].Value
+ m.Groups[2].Value.Substring(0, 1).ToUpper()
+ m.Groups[2].Value.Substring(1));
如果您决定不使用 \p{P} 类,则必须自己指定字符,类似于:
string pattern = @"(^|[.?!""]\s+)(\w+)";
编辑: 下面是一个更新的示例,用于演示 3 种模式。第一个显示所有标点符号如何影响大小写。第二个展示了如何使用类减法来挑选某些标点符号类别。它使用所有标点符号,同时删除特定的标点符号组。第三个与第二个类似,但使用不同的组。
MSDN 链接没有说明某些标点符号类别所指的内容,所以这里有一个细分:
-
P:所有标点符号(包括以下所有类别)
-
电脑:下划线
_
-
Pd:破折号
-
-
Ps:开括号、方括号和大括号
([{
-
Pe:右括号、方括号和大括号
) ] }
-
Pi:初始单引号/双引号(MSDN 说它“可能表现得像 Ps/Pe,具体取决于使用情况”)
-
Pf:最后的单引号/双引号(适用 MSDN Pi 注释)
-
Po:逗号、冒号、分号和斜杠等其他标点符号
,、:、;、\、/
仔细比较这些组对结果的影响。这应该给你很大的灵活性。如果这看起来不理想,那么您可以在字符类中使用特定字符,如前所示。
string input = @"foo ( parens ) bar { braces } foo [ brackets ] bar. single ' quote & "" double "" quote.
dash - test. Connector _ test. Comma, test. Semicolon; test. Colon: test. Slash / test. Slash \ test.";
string[] patterns = {
@"(^|\p{P}\s+)(\w+)", // all punctuation chars
@"(^|[\p{P}-[\p{Pc}\p{Pd}\p{Ps}\p{Pe}]]\s+)(\w+)", // all punctuation chars except Pc/Pd/Ps/Pe
@"(^|[\p{P}-[\p{Po}]]\s+)(\w+)" // all punctuation chars except Po
};
// compiled for performance (might want to benchmark it for your loop)
foreach (string pattern in patterns)
{
Console.WriteLine("*** Current pattern: {0}", pattern);
string result = Regex.Replace(input, pattern,
m => m.Groups[1].Value
+ m.Groups[2].Value.Substring(0, 1).ToUpper()
+ m.Groups[2].Value.Substring(1));
Console.WriteLine(result);
Console.WriteLine();
}
请注意,“Dash”不是使用最后一个模式大写的,而是在一个新行上。使其大写的一种方法是使用RegexOptions.Multiline 选项。试试上面的sn-p,看看是否满足你想要的结果。
另外,为了举例,我没有在上面的循环中使用 RegexOptions.Compiled。要同时使用这两个选项或它们:RegexOptions.Compiled | RegexOptions.Multiline。