正则expression式,用大写字母拆分string,但忽略TLA

我正在使用正则expression式

System.Text.RegularExpressions.Regex.Replace(stringToSplit, "([AZ])", " $1").Trim() 

以大写字母拆分string,例如:

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

使用枚举时,我发现这非常有用。 我想要做的是稍微改变它,这样string只在下一个字母是小写字母的情况才会被分割,例如:

今日 美国”将成为“今日美国”

可以这样做吗?

编辑:感谢所有的回应。 我可能没有完全想到这一点,在某些情况下,“A”和“我”需要被忽略,但这是不可能的(至less不是有意义的)。 在我的情况下,虽然下面的答案做我所需要的。 谢谢!

 ((<= [AZ])[AZ] |?[AZ](= [AZ]))

或者它的Unicode意识表亲

 ((<= \ p {的L1})\ p {路} |?\ p {路}(= \ p {的L1}))

全球取代时

 " $1" 

手柄

 TodayILiveInTheUSAWithSimon
今日美国
 IAmSOOOBored

生产

 今天我和Simon一起住在美国
今日美国
我很无聊

在第二步中,你必须修剪string。

任何大写字符后面都没有大写字母:

 Replace(string, "([AZ])(?![AZ])", " $1") 

编辑:

我只是注意到你正在使用这个枚举。 我真的不鼓励使用像这样的枚举的string表示,而手边的问题是一个很好的理由。 看看这个,而不是: http : //www.refactoring.com/catalog/replaceTypeCodeWithClass.html

你可以考虑改变枚举。 MS编码指南build议帕斯卡套pipe缩略语,就好像它们是单词; XmlDocumentHtmlWriter等。但是,两个字母的acryonyms并不遵循这个规则, System.IO

所以你应该使用UsaToday ,你的问题就会消失。

Tomalak的expression方式适用于我,但不适用于内置的Replace函数。 Regex.Replace()然而,工作。

 For i As Integer = 0 To names.Length - 1 'Worked names(i) = Regex.Replace(names(i), "((?<=[az])[AZ]|[AZ](?=[az]))", " $1").TrimStart() ' Didn't work 'names(i) = Replace(names(i), "([AZ])(?=[az])|(?<=[az])([AZ])", " $1").TrimStart() Next 

顺便说一句,我用这个拆分枚举名称中的单词,以显示在用户界面,它的作品非常漂亮。

注意:我没有读到这个问题,USAToday会返回“Today”。 所以这个anwser是不正确的。

  public static List<string> SplitOnCamelCase(string text) { List<string> list = new List<string> (); Regex regex = new Regex(@"(\p{Lu}\p{Ll}+)"); foreach (Match match in regex.Matches(text)) { list.Add (match.Value); } return list; } 

这将匹配“WakeOnBoot”作为“启动时唤醒”,并且不返回NMI或TLA上的任何内容

我的版本也处理简单​​的算术expression式:

 private string InjectSpaces(string s) { var patterns = new string[] { @"(?<=[^AZ,&])[AZ]", // match capital preceded by any non-capital except ampersand @"(?<=[AZ])[AZ](?=[az])", // match capital preceded by capital and followed by lowercase letter @"[\+\-\*\/\=]", // match arithmetic operators @"(?<=[\+\-\*\/\=])[0-9,\(]" // match 0-9 or open paren preceded by arithmetic operator }; var pattern = $"({string.Join("|", patterns)})"; return Regex.Replace(s, pattern, " $1"); }