Member 13655335 Ответов: 3

Приложение Wpf для подсчета специальных символов


я хочу создать приложение WPF, которое будет подсчитывать специальные символы из text.txt файл by OpenFiledialoug и отображение в текстовом поле ...
Проблема в том, что я столкнулся с исключением на линии :
var subRegex = Regex.Matches(file, item.ToString());

System.ArgumentException: 'parsing "\" - Illegal \ at end of pattern.'


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

private void OpenButon_Click(object sender, RoutedEventArgs e)
       {
           OpenFileDialog openFile = new OpenFileDialog();

           if (openFile.ShowDialog() == true)
           {
               string filepath = openFile.FileName;

               var regexString = @"[{(-_!@#$%^&*+<>,./\\?|':;~)}]";

               var file = filepath;
               var rex = new Regex(regexString, RegexOptions.IgnoreCase);
               var results = rex.Matches(file);
               foreach(var item in results)
               {
                   var subRegex = Regex.Matches(file, item.ToString());
                   textbox.Text += "No of Character:" + item + " appearance: " + subRegex.Count;
               }
           }
       }

3 Ответов

Рейтинг:
2

Richard MacCutchan

Это подозрительно похоже на вопросы, опубликованные вчера под другим идентификатором пользователя: Подсчет специальных символов из текстового файла в C# WPF[^].

Если вы один и тот же человек, то, пожалуйста, закройте дублирующуюся учетную запись пользователя. Если вы просто друзья, то соберитесь вместе и помогайте друг другу.


Member 13655335

да, я выбираю код с этого поста, но я его не знаю ... но, пожалуйста, не могли бы вы сказать мне, где я ошибаюсь?

Richard MacCutchan

У вас есть некоторые неэкранированные специальные символы в вашей строке, см. Язык Регулярных Выражений - Краткий Справочник | Microsoft Docs[^].

Вам также не нужна двойная обратная косая черта, если у вас есть @ префикс в вашем строковом литерале.

OriginalGriff

Да, это так: обратная косая черта также является escape-символом для самого процессора регулярных выражений.

Richard MacCutchan

:большой палец вверх:

Это действительно лучший смайлик для "Спасибо"?

Рейтинг:
1

OriginalGriff

Где бы вы ни получили этот код, вы не думали, прежде чем изменить его.
1) он не пытается проверить содержимое файла: эта строка:

var file = filepath;
ничего не читает из файла.
Ты можешь попробовать:
var file = File.ReadAllText(filepath);

2) ваше регулярное выражение соответствует всему. '.' в регулярном выражении означает "любой символ вообще", поэтому наличие точки в вашем регулярном выражении означает, что она всегда будет соответствовать каждому символу:
[{(-_!@#$%^&*+<>,./\\?|':;~)}]
Функционально идентичен
[.]
Или даже
.
Этого нужно избежать с помощью"\".
3) даже если вы исправите это, регулярное выражение содержит "специальные символы", такие как '^' - "начало строки или строки" и '$' - "конец строки или строки". Специальные символы должны быть экранированы так же, как и".".
4) внутри вашей петли: как вы думаете, что это делает? ваше регулярное выражение соответствует отдельным символам, а затем вы предполагаете, что они автоматически являются допустимыми регулярными выражениями?
Это код, который генерирует сообщение об ошибке: как только ваше регулярное выражение совпадает с первым " \ " - что произойдет очень быстро, учитывая, что ваш существующий код анализирует путь к файлу, а не содержимое файла, - процессор регулярных выражений выходит из строя, потому что это escape-символ, и за ним должен следовать символ, который вы экранируете.

Даже если я поверю, что вы не тот человек, который уже дважды отправлял этот вопрос - что было бы очень странно. ОГРОМНЫЙ прыжок веры - тогда вам нужно понять, что вы не можете просто вырезать кусочки кода, сложить их вместе и получить то, что вы хотите: вам нужно подумать о том, что делает данный вам код, и как это может стать основой для ваших требований. Вы почти никогда не найдете код, который можно просто скопировать, вставить и отправить в качестве домашнего задания и ожидать, что он будет работать как есть.


Рейтинг:
0

CPallini

Время выполнения является правильным (конечно), так как Регулярное выражение.Совпадения(Строка, Строка)[^] ожидает шаблон регулярного выражения в качестве второго параметра, и вы не передаете шаблон.

Обратите внимание, что вы не ищете специальные символы внутри файла, а выполняете их сериализацию внутри самого файла. путь.

Я настоятельно рекомендую вам прочитать учебник по .NET регулярное выражение.