正则表达式,用大写字母拆分字符串但忽略TLA

Sim*_*mon 29 .net regex

我正在使用正则表达式

System.Text.RegularExpressions.Regex.Replace(stringToSplit, "([A-Z])", " $1").Trim()
Run Code Online (Sandbox Code Playgroud)

用大写字母拆分字符串,例如:

'MyNameIsSimon'成为'我的名字是西蒙'

在使用枚举时,我发现这非常有用.我想要做的是稍微更改它,以便只有当下一个字母是小写字母时才拆分字符串,例如:

'USAToday'将成为'今日美国'

可以这样做吗?

编辑:感谢大家的回应.我可能没有完全想到这一点,在某些情况下'A'和'I'需要被忽略,但这是不可能的(至少不是以一种有意义的方式).在我的情况下,虽然下面的答案做我需要的.谢谢!

Tom*_*lak 43

((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))

或其支持Unicode的表兄弟

((?<=\p{Ll})\p{Lu}|\p{Lu}(?=\p{Ll}))

全局替换时

" $1"
Run Code Online (Sandbox Code Playgroud)

手柄

TodayILiveInTheUSAWithSimon
USAToday
IAmSOOOBored

生产

 Today I Live In The USA With Simon
USA Today
I Am SOOO Bored

在第二步,你必须修剪字符串.

  • 转换为字符串扩展方法:`public static string SeperateCamelCase(this string value){return Regex.Replace(value,"((?<= [az])[AZ] | [AZ](?= [az]))" ,"1美元"); }` (6认同)
  • `([AZ])(?<= [az]\1 | [A-Za-z]\1(?= [az]))`不会在开头添加空格,因为它永远不会匹配第一个信件.:) (3认同)
  • 为了解决修剪的需要,我可以建议:((?&lt;=[az])[AZ]|(?&lt;!^)[AZ](?=[az])) (2认同)
  • @AlanMoore 发布的支持 Unicode 的版本,不需要 `.Trim()` 调用,因为它与第一个字母不匹配:`@"(\p{Lu})(?&lt;=\p{Ll}\ 1|(\p{Lu}|\p{Ll})\1(?=\p{Ll}))"` (2认同)

Dav*_*und 12

任何未跟随大写字符的大写字符:

Replace(string, "([A-Z])(?![A-Z])", " $1")
Run Code Online (Sandbox Code Playgroud)

编辑:

我刚刚注意到你正在使用它进行枚举.我真的不鼓励使用像这样的枚举的字符串表示,并且手头的问题是一个很好的理由.请看一下:http: //www.refactoring.com/catalog/replaceTypeCodeWithClass.html

  • 这不处理“我”,即“IAmBored”不会像我认为 OP 所期望的那样被拆分为“我很无聊”。 (2认同)