LRazvan96 Ответов: 3

C# создайте строку в foreach


Я должен взять несколько слов из файла и поместить их в новую строку. Я стук, когда мне нужно сделать новую строку с этим "k" var.

Я должен сделать строку со всеми значениями "k".


Спасибо

Что я уже пробовал:

class Program
   {


       static void Main()
       {
           string[] text1 = new string[] { }; //i tried with a string but... nothing
           string text = System.IO.File.ReadAllText(@"Dat is my file location");
           List<string> list = new List<string>();  ///not even with a list... now i try to put the "k" to an list and after it to convert to string.. but nothing too :(

           Regex pattern1 = new Regex("(?<=ECU_ADDRESS).*?(?=)", RegexOptions.RightToLeft);               //The start and stop of my file
           MatchCollection allMatches1 = pattern1.Matches(text);
           StringBuilder builder = new StringBuilder();
           foreach (var k in allMatches1)    //here is the "k" var
           {



               Console.WriteLine(k);     // here i want to see all my k
               list.Add(k.ToString());            //   here i tried to see what i
                                                     //   have in list but... nothing
               list.ForEach(Console.WriteLine);

               ////////////////////builder.Append(k).Append(", ");

           }

3 Ответов

Рейтинг:
26

OriginalGriff

Во-первых, k-это не "слово", а регулярное выражение Match экземпляр класса, поэтому, чтобы получить содержимое, которому он соответствует, вам нужно использовать k.Value, нет k
Во - вторых, вы пытаетесь написать список внутри цикла, который его создает, - вы хотите, чтобы это было в конце.
В-третьих, у вас есть StringBuilder, и вы даже не используете его!

Это выглядит так, как будто вы просто гадаете и надеетесь, что все это сработает - и это не та стратегия, которая сработает, совсем нет. Перестаньте гадать и начните думать - планируйте, что вы собираетесь делать, а затем, если вы не знаете, как, начните разбивать это на более мелкие шаги.

Попробовать это:

string text = System.IO.File.ReadAllText(@"Dat is my file location");
Regex pattern1 = new Regex("(?<=ECU_ADDRESS).*?(?=)", RegexOptions.RightToLeft);               //The start and stop of my file
MatchCollection allMatches = pattern1.Matches(text);
StringBuilder words = new StringBuilder();
foreach (Match match in allMatches)
    {
    words.AppendLine(match.Value);
    }
Console.Write(words.ToString());
Но... ваше регулярное выражение выглядит неправильно. Он похож на тот, что я дал вам вчера, но взломал мой кто-то, кто не понимает регулярных выражений:
(?<=ID Config:\\s+)\\w+(?=\\s)
Ваша версия не имеет завершающего условия ("(? =\\s)" в моей-это "остановка на первом пробеле", ваша просто пуста, а часть ".*?" говорит "абсолютно ничего не соответствует", потому что "*" означает "ноль или более повторений чего-либо вообще", а "?" после нее говорит "как можно меньше", что всегда будет означать "нет, пожалуйста".

Остановитесь, посмотрите на свои данные и определите, что именно определяет начало и конец текста, который вы хотите захватить. Затем используйте образец, который я дал вам вчера, и копию Expresso, чтобы решить, что вам нужно: Экспрессо[^] - это бесплатно, и он проверяет и генерирует регулярные выражения.


LRazvan96

Вы имеете на это право. Я так вам благодарен!
Одна вещь... не собирается с .Value . Мне нужно было переодеться .Метод toString();

И да, я должен поставить "\\s" прямо там.
Извините за мои вопросы.

OriginalGriff

Да, он действительно работает с .Value - свойство .Value уже является строкой!

https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.capture.value?view=netframework-4.7.2#System_Text_RegularExpressions_Capture_Value

(Это наследственное от захвата моего класса матч )

Не извиняйтесь за вопросы - просто попытайтесь подумать, прежде чем прыгать в код. Это действительно работает быстрее и лучше, честное слово! :смеяться:

Richard Deeming

Вероятно, потому что вы используете var для переменной цикла вместо Match как и ОГ.

То MatchCollection класс реализует только не-универсальный IEnumerable интерфейс, а не универсальный IEnumerable<Match> интерфейс. В результате, если вы попросите компилятор "угадать" тип переменной цикла с помощью var, он будет выбирать Object- поскольку это вся информация , которой он располагает.

Если вы явно укажете ему, какой тип использовать, он будет использовать этот тип. (Если вы скажете ему использовать неправильный тип, вы получите InvalidCastException во время выполнения.)

Рейтинг:
0

CPallini

То Matches метод не возвращает коллекцию строк. Вместо этого он возвращает коллекцию, ну, Match объекты.
Вы должны получить доступ к свойствам таких объектов, чтобы получить нужные вам строки. См. пример кода в разделе документация[^].


Рейтинг:
0

Richard MacCutchan

Вы загромождаете свой код множеством случайных величин, которые никогда не используете. Эту проблему довольно легко решить, как объяснил вам вчера @OriginalGriff в своем вопросе по адресу https://www.codeproject.com/Questions/1258200/How-do-I-writte-a-code-in-Csharp-for-read-some-wor[^].

private static Regex findID= new Regex(
      "(?<=ID Config:\\s+)\\w+(?=\\s)",
    RegexOptions.Multiline
    | RegexOptions.CultureInvariant
    | RegexOptions.Compiled
    );
...
    String InpuText = System.IO.File.ReadAllText(@"Dat is my file location");
    MatchCollection ms = findID.Matches(InputText);
    foreach (Match m in ms)
    {
        Console.WriteLine(m.Value);
    }       


Приношу свои извинения ОГУ за то, что он "исправил" его ужасную вмятину от брекетов. :)


OriginalGriff

- Приношу извинения ОГУ за то, что он "испортил" свой правильный отступ от брекетов."
Ftfy! :смеяться: