Повторите подстроки N раз - PullRequest
2 голосов
/ 04 апреля 2019

Я получаю серию строк, за которыми следуют неотрицательные числа, например, "a3".Я должен напечатать на консоли каждую строку, повторенную N раза ( заглавными буквами ), где N - это число на входе.В примере результат: "AAA".Как вы видите, я попытался получить цифры из ввода, и я думаю, что он работает нормально.Можете ли вы помочь мне с повторением?

string input = Console.ReadLine();
//input = "aSd2&5s@1"
MatchCollection matched = Regex.Matches(input, @"\d+");
List<int> repeatsCount = new List<int>();

foreach (Match match in matched)
{
    int repeatCount = int.Parse(match.Value);
    repeatsCount.Add(repeatCount);
}
//repeatsCount: [2, 5, 1]
//expected output: ASDASD&&&&&S@ ("aSd" is converted to "ASD" and repeated twice;
// "&" is repeated 5 times; "s@" is converted to "S@" and repeated once.)

Например, если у нас есть «aSd 2 & 5 s @ 1 »: "aSd" преобразуется в "ASD" и повторяется дважды ;"&" повторяется 5 раз ;"s@" конвертируется в "S@" и повторяется один раз .

Ответы [ 5 ]

3 голосов
/ 04 апреля 2019

Пусть шаблон включает две группы : value для повторения и сколько times для повторения:

@"(?<value>[^0-9]+)(?<times>[0-9]+)"

Тогда мы можем работать с этими группами , скажем, с помощью Linq :

  string source = "aSd2&5s@1";

  string result = string.Concat(Regex
    .Matches(source, @"(?<value>[^0-9]+)(?<times>[0-9]+)")
    .OfType<Match>()
    .SelectMany(match => Enumerable                        // for each match
       .Repeat(match.Groups["value"].Value.ToUpper(),      // repeat "value"
               int.Parse(match.Groups["times"].Value))));  // "times" times 

  Console.Write(result);

Результат:

ASDASD&&&&&S@

Редактировать: Та же идея без Linq :

  StringBuilder sb = new StringBuilder();

  foreach (Match match in Regex.Matches(source, @"(?<value>[^0-9]+)(?<times>[0-9]+)")) {
    string value = match.Groups["value"].Value.ToUpper();
    int times = int.Parse(match.Groups["times"].Value);

    for (int i = 0; i < times; ++i)
      sb.Append(value);
  }

  string result = sb.ToString();
1 голос
/ 04 апреля 2019

Очень простая программа.Никакого linq ничего, простой цикл string и for.

string input = "aSd2&5s@1";
char[] inputArray = input.ToCharArray();
string output = "";

string ab = "";
foreach (char c in inputArray)
{
    int x;
    string y;
    if(int.TryParse(c.ToString(), out x))
    {
        string sb = "";
        ab = ab.ToUpper();
        for(int i=0;i<b;i++)
        {
           sb += ab;
        }
        ab = "";
        output += sb;
    }
    else
    {
        ab += c;
    }
}
if(!string.IsNullOrEmpty(ab))
{
    output += ab.ToUpper();
}
Console.WriteLine(output);

Надеюсь, это поможет.

1 голос
/ 04 апреля 2019

Мое решение такое же, как у других, с небольшими отличиями:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication107
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "aSd2&5s@1";
            string pattern1 = @"[a-zA-z@&]+\d+";
            MatchCollection matches = Regex.Matches(input, pattern1);

            string output = "";
            foreach(Match match in matches.Cast<Match>().ToList())
            {
                string pattern2 = @"(?'string'[^\d]+)(?'number'\d+)";
                Match match2 = Regex.Match(match.Value, pattern2);
                int number = int.Parse(match2.Groups["number"].Value);
                string str = match2.Groups["string"].Value;

                output += string.Join("",Enumerable.Repeat(str.ToUpper(), number));
            }
            Console.WriteLine(output);
            Console.ReadLine();


        }
    }


}
1 голос
/ 04 апреля 2019

Другое решение без LINQ

Я пытался сохранить решение таким образом, чтобы оно было похоже на ваше

string input = "aSd2&5s@1";
var matched = Regex.Matches(input, @"\d+");
var builder = new StringBuilder();
foreach (Match match in matched)
{
     string stingToDuplicate = input.Split(Char.Parse(match.Value))[0];
     input = input.Replace(stingToDuplicate, String.Empty).Replace(match.Value, String.Empty);
      for (int i = 0; i < Convert.ToInt32(match.Value); i++)
      {
                  builder.Append(stingToDuplicate.ToUpper());
      }
 }

и, наконец, Console.WriteLine(builder.ToString());, что в результате ASDASD&&&&&S@

1 голос
/ 04 апреля 2019

Вы можете извлечь подстроку и как часто ее следует повторять с этим регулярным выражением:

(?<content>.+?)(?<count>\d+)

Теперь вы можете использовать StringBuilder для создания выходной строки.Полный код:

var input = "aSd2&5s@1";
var regex = new Regex("(?<content>.+?)(?<count>\\d+)");
var matches = regex.Matches(input).Cast<Match>();
var sb = new StringBuilder();
foreach (var match in matches)
{
    var count = int.Parse(match.Groups["count"].Value);
    for (var i = 0; i < count; ++i)
        sb.Append(match.Groups["content"].Value.ToUpper());
}

Console.WriteLine(sb.ToString());

Вывод

ASDASD &&&&& S @

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...