Струнный источник

" / JaME / ng2ih4cj3ekk8 / HAKI / g8o7o3 "

Как их сгруппировать:

JaME , нг , 2

JaME , IH , 4

JaME , CJ , 3

JaME , EKK , 8

HAKI , г, 8

HAKI , о, 7

HAKI , о, 3

И это мой код и результат:

Console.OutputEncoding = Encoding.UTF8;
MatchCollection mc;
string source = "/jame/n2i4c3e8/haki/g8o7o3";

string pattern = @"(/[A-Z_a-z]+/)|([A-Z_[ạảàáãăắẳằặẵâấẩầậẫóỏòọõôốổồộỗơớởờợỡéèẻẹẽêếềểệễúùủụũưứừửựữíìỉịĩýỳỷỵỹđ_ẠẢÀÁÃĂẮẲẰẶẴÂẤẨẦẬẪÓỎÒỌÕÔỐỔỒỘỖƠỚỞỜỢỠÉÈẺẸẼÊẾỀỂỆỄÚÙỦỤŨƯỨỪỬỰỮÍÌỈỊĨÝỲỶỴỸĐ_a-z]+_?[0-9_/._0-9]+)";
Regex myRegex = new Regex(pattern);
mc = myRegex.Matches(source);
foreach (Match m in mc)
{
    Console.WriteLine(m.Value);
}
Console.ReadLine();

/ JaME /

NG2

ih4

CJ3

ekk8 /

HAKI /

g8

o7

а3

-1
Jr.Kan 24 Апр 2017 в 18:56

2 ответа

Лучший ответ

Это разбивает источник на группы из двух элементов («ключ» и значение) и разбивает значение на несколько подстрок, заканчивающихся цифрами.

var source = "/jame/ng2ih4cj3ekk8/haki/g8o7o3";
var results = source.Split("/".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
    .Select ((value, index) => new {value, index})
    .GroupBy(item => item.index / 2, item => item.value);

foreach (var result in results)
{
    var items = Regex.Replace(result.Last(), @"\d", match =>
    {
        return "," + match.Value + Environment.NewLine;
    });

    foreach (var item in items.Split(Environment.NewLine.ToCharArray(),
                                     StringSplitOptions.RemoveEmptyEntries))
        Console.WriteLine(result.First() + "," + item);
}

Тем не менее, я думаю, что могу сделать лучше. Подержи мое пиво.

РЕДАКТИРОВАТЬ : эта версия использует аргумент MatchEvaluator в вызове Regex.Replace для форматирования выходной строки:

var source = "/jame/ng2ih4cj3ekk8/haki/g8o7o3";
var result = Regex.Replace(source, @"/(?<group>.*?)/(?<value>[^/]+)", match =>
{
    return Regex.Replace(match.Groups["value"].Value, @"(?<letter>\D+)(?<number>\d)",sub =>
    {
        return match.Groups["group" ].Value + "," +                // "jame,"
               sub  .Groups["letter"].Value + "," +                // "ng,"
               sub  .Groups["number"].Value + Environment.NewLine; // "2<CRLF>"
    });
});

Console.WriteLine(result);
3
Rubens Farias 24 Апр 2017 в 16:46

Вы можете использовать этот код:

string source = "/jame/n2i4c3e8/haki/ns2is5cs6eu7";
var splitted = Regex.Split(source, @"(?=\/[a-z]+\/)");

foreach (var word in splitted.Where(x => !string.IsNullOrEmpty(x)))
{
    var cutted = word.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
    var baseWord = cutted.First();

    foreach(var end in Regex.Split(cutted.Last(), @"([a-z]+\d)").Where(x => !string.IsNullOrEmpty(x)))
        Console.WriteLine($"/{baseWord}/{Regex.Match(end, @"[a-z]+")},{Regex.Match(end, @"\d+")} ");
}
0
Thomas Ayoub 24 Апр 2017 в 16:20
43592713