每次角色更改时如何拆分字符串?

时间:2017-04-27 22:39:52

标签: c#

我想将abbbbcc之类的字符串转换成这样的数组:C#中的[a,bbbb,cc]。我从this Java question尝试了正则表达式,如此:

var test = "aabbbbcc";
var split = new Regex("(?<=(.))(?!\\1)").Split(test);

但这导致我的序列[a,a,bbbb,b,cc,c]。如何在C#中实现相同的结果?

5 个答案:

答案 0 :(得分:3)

这是一个使用Aggregate

的LINQ解决方案
var input = "aabbaaabbcc"; 
var result = input
    .Aggregate(" ", (seed, next) => seed + (seed.Last() == next ? "" : " ") + next)
    .Trim()
    .Split(' ');

它根据最后一个字符聚合每个字符,然后如果它遇到一个新字符,它会在累积字符串中附加一个空格。然后,我只是使用普通String.Split将其全部拆分。

结果:

  

[“aa”,“bb”,“aaa”,“bb”,“cc”]

答案 1 :(得分:1)

我不知道怎么用拆分完成它。但这可能是一个很好的选择:

//using System.Linq;

var test = "aabbbbcc";
var matches = Regex.Matches(test, "(.)\\1*");
var split = matches.Cast<Match>().Select(match => match.Value).ToList();

答案 2 :(得分:1)

这里有几件事正在产生你所看到的输出:

  1. 正则表达式结合了正面的后观和负面的前瞻,以找到与前面的字符匹配的最后一个字符,但与后面的字符不匹配。

  2. 它为每个匹配创建捕获组,然后将其作为分隔符提供给Split方法。负向前瞻需要捕获组,特别是\1标识符,这基本上意味着“语句中第一个捕获组的值”,因此不能省略。

  3. Regex.Split,给定一个捕获组或多个捕获组以在识别拆分分隔符时匹配,包括用于每个单独拆分操作的分隔符。

  4. 数字 3 是您的字符串数组看起来很奇怪的原因,Split将在字符串中的最后a上拆分,这将成为split [0]。接下来是split [1]等分隔符......

    调用Split时无法覆盖此行为。 根据Gusman的答案进行补偿或根据Ruard的答案预测Matches电话的结果将得到你想要的。

答案 3 :(得分:0)

说实话,我并不完全理解正则表达式是如何工作的,但你可以修复&#34;输出非常容易:

Regex reg = new Regex("(?<=(.))(?!\\1)", RegexOptions.Singleline);
var res = reg.Split("aaabbcddeee").Where((value, index) => index % 2 == 0 && value != "").ToArray();

答案 4 :(得分:0)

可以轻松地使用Linq,但我不认为它的运行时间和正则表达式一样好。

虽然更容易阅读。

        var myString = "aaabbccccdeee";
        var splits = myString.ToCharArray()
             .GroupBy(chr => chr)
             .Select(grp => new string(grp.Key, grp.Count()));

返回值`[&#39; aaa&#39;,&#39; bb&#39;,&#39; cccc&#39;,&#39; d&#39;,&#39; eee&# 39]

但是,如果你有一个像"aabbaa"这样的字符串,那么这不会有效,你只会得到["aaaa","bb"]而不是["aa","bb","aa"]