#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
.