Я пытаюсь получить JJ01G3C5-10A6S0
из:
\\JJ01G3C5-10A6S0\C$\2015\Mar\24\
с
Regex reg = new Regex("[^\\\\].+\\");
Примечание. Я не могу предположить, что значение будет конкретно в этом формате, поэтому единственный способ для меня прекратить строку - предположить, что он начинается с двойного обратного слэша\\затем некоторые данные... и затем завершается одним обратным слэшем \
Однако это меня бросает:
Необработанное исключение: System.ArgumentException: синтаксический разбор
"[^\\].+\"
- Недопустимый\
в конце шаблона.
Не существует способа иметь обратную косую черту как терминатор регулярных выражений?
Альтернатива, предполагающая его путь:
string unc_server_name = new Uri(@"\\JJ01G3C5-10A6S0\C$\2015\Mar\24\").Host;
когда вы пишете регулярное выражение, лучше всего использовать дословные строковые литералы, то есть префикс @
для строки с двойными кавычками. Это не позволяет компилятору рассматривать обратную косую черту как символ escape. Без @
вам нужно удвоить все обратные косые черты.
Также вам не нужно использовать квадратные скобки. Это для классов персонажей.
Regex reg = new Regex("^\\\\\\\\.+\\\\");
или эквивалентно (и более понятно)
Regex reg = new Regex(@"^\\\\.+?\\");
Это анализирует как:
^
начало строки\\
означает буквальную обратную косую черту\\
означает еще одну буквальную обратную косую черту.+?
что означает более одного символа\\
означает еще одну буквальную обратную косую черту +?
обозначение означает, что оно не жадное, оно соответствует как можно меньшему количеству символов, чтобы совместить все. В противном случае он попытается сопоставить все.
$
- это не начало строки ^
(как у вас есть в регулярном выражении), и вы не используете .+?
в регулярном выражении.
Вы можете использовать это регулярное выражение:
Regex regex = new Regex(@"(?<=\\\\)[^\\]*(?=\\)");
@"\\JJ01G3C5-10A6S0\C$\201t('\\')[2]