正则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缩略语,就好像它们是单词; XmlDocument
, HtmlWriter
等。但是,两个字母的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"); }