在正则表达式中,如何在每个以大写字母开头的单词之间添加一个额外的空格?

3

我有一个字符串:CategoryName

我需要在CategoryName之间添加空格。

因此,我必须在每个大写字母前插入一个空格。


2
正则表达式可能太慢了:https://dev59.com/enVC5IYBdhLWcg3whBWj?rq=1 - amnezjak
1
SimpleHTTPRequest怎么样?你真的希望它变成Simple H T T P Request吗?不应该是Simple HTTP Request吗? - Tim Pietzcker
我的答案支持Tim的观点,但如果有数字会发生什么呢?例如:MyCategory1MyCategory2Fish - Bob Vale
3个回答

5
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

正如Tim所指出的那样,SimpleHTTPRequest怎么样?这个答案应该给出Simple HTTPRequest,而不是Simple HTTP Request - Bob Vale
HaveAGo 怎么样? - Bob Vale
@BobVale 这将产生 Have AGo,但不清楚是否应该拆分 AGo。例如,我们不需要将 HTTP 拆分为 H T T P。顺便说一句,这就是为什么我总是为涉及正则表达式的代码编写单元测试的原因 :) - Sergey Berezovskiy
是的,但HTTP所有字母都是大写的,而AGo有一个小写的“o”。 - Bob Vale

4
这段代码将完成任务。
var 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]后跟一个小写字母 - )结束捕获组1
我实际上已经将其作为库函数使用了很多次。
public 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();

+1 从我这里,那应该是个答案! - Sergey Berezovskiy
顺便说一句,看起来你不需要最后一组小写字母 - 你可以简单地使用((?<=[a-z])[A-Z]|(?<!^|\s)[A-Z][a-z])。但是还是很好的答案。 - Sergey Berezovskiy
1
@lazyberezovsky 很好的观点,我一直在专注于确保只匹配大写字母,没有考虑到可以包括以下小写字母,因为使用后向查找可以实现匹配。我会进行更新。 - Bob Vale
@lazyberezovsky 你为什么把字段上的readonly去掉了? - Bob Vale
@BobValue,我添加了你遗漏的变量类型名称。新字符串private static readonly Regex太长了,所以我删除了不重要的部分,以便从代码窗口中摆脱滑块 - 滚动到右侧查看代码(实际上是最重要的部分)并不方便。如果您愿意,可以将赋值拆分为两行。 - Sergey Berezovskiy

0
([A-Z?])[_ ]?([a-z])

尝试使用这个正则表达式。

希望能有所帮助。


这将匹配A-Z或a?后面跟着一个可选的空格或下划线,然后是a-z。 - Bob Vale
由于问题中有大写条件,因此请按A-Z进行编程。 - Freelancer
但是你期望 [A-Z?] 中的 ? 做什么?OP要求提供一种插入空格的方法,但你没有展示如何使用正则表达式来实现。 - Bob Vale

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接