RegEx — Квантор {x, y} после ничего ошибка

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

У меня есть этот код:

       string regPattern = "*[~#%&*{}/<>?|\"-]+*";
       string replacement = "";
       Regex regExPattern = new Regex(regPattern);

Все же, когда мое приложение поражает regExPattern строку, я получаю ArgumentException - Квантор {x, y} после ничего ошибка.

Кто-то может помочь?

Править: Я должен передать этот шаблон в цикл foreach как так:

    if (paths.Contains(regPattern))
        {
            foreach (string files2 in paths)
            {
                try
                {
                    string filenameOnly = Path.GetFileName(files2);
                    string pathOnly = Path.GetDirectoryName(files2);
                    string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement);
                    string sanitized = Path.Combine(pathOnly, sanitizedFileName);
                    //write to streamwriter
                    System.IO.File.Move(files2, sanitized);

                }
                catch (Exception ex)
                {
                    //write to streamwriter

                }
            }
        } 
        else
        { 
        //write to streamwriter

        }

Как я определяю шаблон, если он передается в этот цикл?

6
задан yeahumok 28 June 2010 в 20:24
поделиться

3 ответа

Обновление: после прочтения комментария к вопросу, я думаю, вам нужно просто следующее:

s = Regex.Replace(s, "[~#%&*{}/<>?|\"-]+", "");

Старый ответ: я думаю, когда вы пишете * вы думаете о подстановочных знаках, таких как те, которые вы вводите в оболочке:

*. Txt

Это не то, как * работает в синтаксисе регулярных выражений. Вместо этого вы, вероятно, захотите . * :

".*[~#%&*{}/<>?|\"-]+.*"

. означает «любой символ», а * означает «ноль или более предыдущего».

Внутри класса символов [...] * теряет свое особое значение и становится буквальным символом, поэтому его не нужно экранировать. Необоснованный экранирование внутри класса символов не причинит никакого вреда, и некоторым людям его легче читать.

6
ответ дан 17 December 2019 в 00:03
поделиться

* - это квантор, означающий «ноль или более раз» (то же самое, что и {0,} ). Вам нужно будет избежать этого, используя обратную косую черту, например: \ *

1
ответ дан 17 December 2019 в 00:03
поделиться

Поскольку вы выполняете Regex.Replace для замены любого из этих односимвольных совпадений пустой строкой:

        string pattern = "[~#%&*{}/()<>?|\"\\\\-^[\\]]";

        string input = @"(*&af%\#$}afd]a#f%hjg{d(^(^[RF*()^FR(7r5";

        string output = Regex.Replace(input, pattern, String.Empty);
0
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: