[英]How to split a string every time the character changes?
我想將諸如abbbbcc
類的字符串abbbbcc
為如下數組:C#中的[a,bbbb,cc]
。 我已經從這個Java問題嘗試過正則表達式,如下所示:
var test = "aabbbbcc";
var split = new Regex("(?<=(.))(?!\\1)").Split(test);
但這對我來說是順序[a,a,bbbb,b,cc,c]
。 如何在C#中獲得相同的結果?
這是使用Aggregate
的LINQ解決方案:
var input = "aabbaaabbcc";
var result = input
.Aggregate(" ", (seed, next) => seed + (seed.Last() == next ? "" : " ") + next)
.Trim()
.Split(' ');
它基於最后一次讀取來匯總每個字符,然后如果遇到一個新字符,則會在累積字符串后附加一個空格。 然后,我使用普通的String.Split
最后將其全部String.Split
。
結果:
[“ aa”,“ bb”,“ aaa”,“ bb”,“ cc”]
我不知道如何用拆分完成它。 但這可能是一個不錯的選擇:
//using System.Linq;
var test = "aabbbbcc";
var matches = Regex.Matches(test, "(.)\\1*");
var split = matches.Cast<Match>().Select(match => match.Value).ToList();
這里發生的幾件事正在產生您所看到的輸出:
正則表達式將正向查找和負向查找結合起來,以找到與前面的字符匹配但與后面的字符不匹配的最后一個字符。
它為每個匹配項創建捕獲組,然后將它們作為分隔符輸入到Split
方法中。 否定的前行需要捕獲組,特別是\\1
標識符,它基本上表示“語句中第一個捕獲組的值”,因此不能省略。
Regex.Split
,給定一個捕獲組或多個捕獲組以在識別拆分定界符時進行匹配,將包括用於每個單獨的Split操作的定界符。
數字3是為什么您的字符串數組看起來很奇怪的原因,Split將在字符串的最后a
進行拆分,該拆分將成為split [0]。 隨后是split [1]等分隔符,等等。
無法在調用Split時覆蓋此行為。 根據Gusman的答案進行補償,或者根據Ruard的答案預測Matches
通話的結果,您都可以得到想要的。
老實說,我不完全了解該正則表達式的工作原理,但是您可以非常輕松地“修復”輸出:
Regex reg = new Regex("(?<=(.))(?!\\1)", RegexOptions.Singleline);
var res = reg.Split("aaabbcddeee").Where((value, index) => index % 2 == 0 && value != "").ToArray();
使用Linq可以輕松做到這一點,但是我認為它的運行時不會像正則表達式那樣好。
整體而言,更容易閱讀。
var myString = "aaabbccccdeee";
var splits = myString.ToCharArray()
.GroupBy(chr => chr)
.Select(grp => new string(grp.Key, grp.Count()));
返回值[['aaa','bb','cccc','d','eee']
但是,如果您有類似"aabbaa"
這樣的字符串,則此方法將不起作用,您將只得到["aaaa","bb"]
而不是["aa","bb","aa"]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.