簡體   English   中英

每次字符更改時如何分割字符串?

[英]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();

這里發生的幾件事正在產生您所看到的輸出:

  1. 正則表達式將正向查找和負向查找結合起來,以找到與前面的字符匹配但與后面的字符不匹配的最后一個字符。

  2. 它為每個匹配項創建捕獲組,然后將它們作為分隔符輸入到Split方法中。 否定的前行需要捕獲組,特別是\\1標識符,它基本上表示“語句中第一個捕獲組的值”,因此不能省略。

  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM