我有一个字符串:CategoryName
我需要在Category
和Name
之间添加空格。
因此,我必须在每个大写字母前插入一个空格。
var input = "CategoryName";
var result = Regex.Replace(input, "([a-z])([A-Z])", @"$1 $2"); //Category Name
更新(这将把一连串的大写字母视为一个单词)
var input = "SimpleHTTPRequest";
var result = Regex.Replace(input, "([a-z]|[A-Z]{2,})([A-Z])", @"$1 $2");
//Simple HTTP Request
SimpleHTTPRequest
怎么样?这个答案应该给出Simple HTTPRequest
,而不是Simple HTTP Request
。 - Bob ValeHaveAGo
怎么样? - Bob ValeHave AGo
,但不清楚是否应该拆分 AGo
。例如,我们不需要将 HTTP
拆分为 H T T P
。顺便说一句,这就是为什么我总是为涉及正则表达式的代码编写单元测试的原因 :) - Sergey Berezovskiyvar source = "CategoryName";
var nameConvert = new Regex(@"((?<=[a-z])[A-Z]|(?<!^|\s)[A-Z][a-z])");
var converted = nameConvert.Replace(source, " $1");
FearTheCIAReally
变成Fear The CIA Really
解释正则表达式:(
开始捕获组$1
- (?<=[a-z])[A-Z]
小写字母前面跟着一个大写字母(不捕获小写字母)
- |
或者
- (?<!^|\s)
前面的字符不是空格或字符串的开始,但不捕获
- [A-Z]
大写字母
- [a-z]
后跟一个小写字母
- )
结束捕获组1public static class StringExtensions {
private static readonly Regex NameConvert =
new Regex(@"((?<=[a-z])[A-Z]|(?<!^|\s)[A-Z][a-z])");
public static string ToDisplayFormat(this string name) {
return string.IsNullOrEmpty(name) ?
String.Empty :
NameConvert.Replace(name," $1");
}
}
然后我只需在代码中使用它
var name="CategoryName";
var displayName = name.ToDisplayFormat();
((?<=[a-z])[A-Z]|(?<!^|\s)[A-Z][a-z])
。但是还是很好的答案。 - Sergey Berezovskiyprivate static readonly Regex
太长了,所以我删除了不重要的部分,以便从代码窗口中摆脱滑块 - 滚动到右侧查看代码(实际上是最重要的部分)并不方便。如果您愿意,可以将赋值拆分为两行。 - Sergey Berezovskiy([A-Z?])[_ ]?([a-z])
尝试使用这个正则表达式。
希望能有所帮助。
[A-Z?]
中的 ?
做什么?OP要求提供一种插入空格的方法,但你没有展示如何使用正则表达式来实现。 - Bob Vale
SimpleHTTPRequest
怎么样?你真的希望它变成Simple H T T P Request
吗?不应该是Simple HTTP Request
吗? - Tim PietzckerMyCategory1
或MyCategory2Fish
。 - Bob Vale