разделите строку на несколько строк на основе количества элементов в квадратных скобках C#

#c# #string

Вопрос:

это моя струна:

 WARNING: 121 - VT PUMP Manual Pick Required for {[60,70]} HP {["Water Feature","Transfer"]} Pump!
 

Я хочу разделить эту строку на несколько строк в зависимости от количества элементов в квадратных скобках.

 WARNING: 121 - VT PUMP Manual Pick Required for 60 HP "Water Feature" Pump!
WARNING: 121 - VT PUMP Manual Pick Required for 70 HP "Transfer" Pump!
 

Комментарии:

1. Но не 60 Transfer и 70 Water Feature ?

Ответ №1:

мои 2 карата (.NET5):

     string pumpMsg = "WARNING: 121 - VT PUMP Manual Pick Required for {[60,70]} HP {["Water Feature","Transfer"]} Pump!";
    var rx1 = new Regex(@"^(?<start>. ?){[(?<numbers>[d ,] )]}(?<middle>. ?){[(?<names>[w ,""] )]}(?<end>.*)$");
    var match1 = rx1.Match(pumpMsg);
    
    if (!match1.Success)
    {
        return;
    }
    
    var g         = match1.Groups;
    var splitOpts = StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries;
    var numbers   = g["numbers"].Value.Split(',', splitOpts).ToArray();
    var names     = g["names"].Value.Split(',', splitOpts).ToArray();
    
    if (names.Length != numbers.Length)
    {
        return;
    }
    
    List<string> messages = Enumerable.Range(0, numbers.Length)
                         .Select(i => $"{g["start"].Value}{numbers[i]}{g["middle"].Value}{names[i]}{g["end"].Value}")
                         .ToList();

 /* result:
  WARNING: 121 - VT PUMP Manual Pick Required for 60 HP "Water Feature" Pump!
  WARNING: 121 - VT PUMP Manual Pick Required for 70 HP "Transfer" Pump!
 */
 

Комментарии:

1. это не сработало бы для следующей строки : «ПРЕДУПРЕЖДЕНИЕ: Ручной выбор НАСОСА 121 ВТ Требуется для [«a»,»b»] [60,70] л. с. [«Характеристика воды»,»Передача»] Насоса!»

2. Возможно, вам следует в первую очередь представить свои варианты использования, данные и предварительные условия 😉

Ответ №2:

Вот аналогичное решение с использованием оценщика соответствия. Не уверен, что это намного лучше

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
namespace ConsoleApplication193
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = "WARNING: 121 - VT PUMP Manual Pick Required for [60, 65, 70] HP ["Water Feature","Start","Transfer"] Pump!";

            List<string> results = MyEvaluator.EnumerateString(input);


        }
    }
    public class MyEvaluator
    {
        static string pattern = @"[[^]] ]";
        static int row;
        static int col;
        static string[][] arrays = null;

        public static List<string> EnumerateString(string input)
        {
            MatchCollection matches = Regex.Matches(input, pattern);

            arrays = matches.Cast<Match>().Select(x => x.Value.Split(new char[] { '[', ',', ']' }, StringSplitOptions.RemoveEmptyEntries).ToArray()).ToArray();

            // Assign the replace method to the MatchEvaluator delegate.
            MatchEvaluator myEvaluator = new MatchEvaluator(ReplaceCC);
            List<string> results = new List<string>();
            for(int i = 0; i < arrays[0].Length; i  )
            {
                row = i;
                col = 0;
                results.Add(Regex.Replace(input, pattern, myEvaluator));
            }
            return results;
        }

 
        static string ReplaceCC(Match m)
        {

            string output = arrays[col][row].Replace(""","");
            col  ;
            return output;
        }
    }
}
 

Ответ №3:

Я решаю эту проблему по следующей логике.

 // text: WARNING: 121 - VT PUMP Manual Pick Required for [60,70] HP ["Water Feature","Transfer"] Pump!

public static List<string> CreateMultipleStringsOnTheNumberOfItemsInBracket(string text)
{
    List<string> lstStrings = new List<string>();
    MatchCollection matchCollection = Regex.Matches(text, @"[(.*?)]");
    int? iterationCount = matchCollection?[0].Value.Split(',').Length;
    for (int i = 0; i < iterationCount; i  )
    {
        string msg = text;
        for (int a = 0; a < matchCollection.Count; a  )
        {
            string str = Regex.Matches(msg, @"[(.*?)]")?[0].Value.ToString();
            string replaceValue = matchCollection[a].Value.Split(',')[i].Replace("[", "").Replace("]", "");
            msg = msg.Replace(str, replaceValue);
        }
        lstStrings.Add(msg);
    }
    return lstStrings;
}
 

Комментарии:

1. Пожалуйста, объясните, как работает этот код и как он отвечает на вопрос?

2. resultList В этом вопросе ничего нет. Здесь нет ExceptionMessage .