Выражение регулярного выражения "\\ u002E [^ \ x5C] * $" не работает в C # - PullRequest
1 голос
/ 17 мая 2019

Я работаю над программой WPF на C #, которая позволяет вручную вводить путь к каталогу. Мои пользователи не являются опытными пользователями компьютеров и могут ввести путь к файлу вместо пути к каталогу.

Я создал регулярное выражение, которое работает на веб-сайте RegExr именно так, как я хочу, но в моем коде C # происходит сбой. Он срабатывает всякий раз, когда расширение файла присутствует в конце пути, который вводит пользователь. Выражение выглядит следующим образом:

\ x2e [^ \ x5c] * $

Я пытался использовать это в

using System;
using System.Text.RegularExpressions;
using System.Windows;

public partial class MainWindow : Window
{
    private void ConvertFile(object sender, RoutedEventArgs e)
    {
        Regex rx = new Regex("\u002E[^\x5C]*$");
    }
}

Я ожидаю, что функция будет работать как положено, но вместо этого я получаю следующую ошибку:

System.ArgumentException: 'синтаксический анализ ". [^] * $" - неопределенный набор [].'

Насколько я могу судить, набор скобок, по-видимому, завершен, и я не вижу в этом ничего плохого, но он все равно не работает. Я попытался добавить и удалить дополнительную обратную косую черту, используя Unicode . и \, обычные . и \ с escape-символами перед ними, разбивая строку на несколько частей и заменяя [] на (). Кажется, ничего не работает, и я продолжаю получать ту же ошибку.

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Эта строка:

"\u002E[^\x5C]*$"

конвертируется компилятором в эту строку:

".[^\]*$"

Коды Escape обрабатываются компилятором, а не механизмом регулярных выражений.

Ваша попытка сбежать:

"\\u002E[^\x5C]*$"

сгенерировал эту строку

"\u002E[^\]*$"

, который все еще позволяет механизму регулярных выражений видеть \] (экранированный обратный слеш) вместо отрицательного символьного класса, состоящего из обратного слеша.

Будет работать отключение интерпретации escape-кодов компилятором с префиксом @, а также экранирование каждый обратный слеш:

"\\u002E[^\\x5C]*$"

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

C:/Users/.default/.profile/

является допустимым именем для каталога.

Наконец, вместо шаблона, совпадающего с именем, почему бы просто не посмотреть, существует ли точное имя, введенное пользователем, и является ли оно каталогом или файлом? Поскольку это также может быть имя каталога:

C:\Users\.default\.profile
0 голосов
/ 17 мая 2019

Попробуйте Regex rx = new Regex(@"\u002E[^\x5C]*$");.@ перед строкой говорит системе интерпретировать каждый символ буквально.Если есть какие-либо символы, для которых вы хотели бы использовать escape-последовательности C # (а не те, которые относятся к регулярному выражению!), Вы сможете разбить строку на несколько и объединить ее с +.

...