我想将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#中实现相同的结果?
答案 0 :(得分:3)
这是一个使用Aggregate
:
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)
这里有几件事正在产生你所看到的输出:
正则表达式结合了正面的后观和负面的前瞻,以找到与前面的字符匹配的最后一个字符,但与后面的字符不匹配。
它为每个匹配创建捕获组,然后将其作为分隔符提供给Split
方法。负向前瞻需要捕获组,特别是\1
标识符,这基本上意味着“语句中第一个捕获组的值”,因此不能省略。
Regex.Split
,给定一个捕获组或多个捕获组以在识别拆分分隔符时匹配,包括用于每个单独拆分操作的分隔符。
数字 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"]