Регулярное выражение с обратной косой чертой в качестве шаблона

1

Я пытаюсь получить JJ01G3C5-10A6S0 из:

\\JJ01G3C5-10A6S0\C$\2015\Mar\24\

с

Regex reg = new Regex("[^\\\\].+\\");

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

Однако это меня бросает:

Необработанное исключение: System.ArgumentException: синтаксический разбор "[^\\].+\" - Недопустимый \ в конце шаблона.

Не существует способа иметь обратную косую черту как терминатор регулярных выражений?

  • 4
    Возможно, вы захотите использовать дословные строки, поставив перед ними знак @, чтобы вам не приходилось делать двойной разделитель.
  • 0
    другой способ сделать это ... @"\\JJ01G3C5-10A6S0\C$\201t('\\')[2]
Показать ещё 2 комментария
Теги:

3 ответа

3
Лучший ответ

Альтернатива, предполагающая его путь:

string unc_server_name = new Uri(@"\\JJ01G3C5-10A6S0\C$\2015\Mar\24\").Host;
  • 0
    это на самом деле прекрасно работает!
3

когда вы пишете регулярное выражение, лучше всего использовать дословные строковые литералы, то есть префикс @ для строки с двойными кавычками. Это не позволяет компилятору рассматривать обратную косую черту как символ escape. Без @ вам нужно удвоить все обратные косые черты.

Также вам не нужно использовать квадратные скобки. Это для классов персонажей.

Regex reg = new Regex("^\\\\\\\\.+\\\\");

или эквивалентно (и более понятно)

Regex reg = new Regex(@"^\\\\.+?\\");

Это анализирует как:

  • ^ начало строки
  • \\ означает буквальную обратную косую черту
  • \\ означает еще одну буквальную обратную косую черту
  • .+? что означает более одного символа
  • \\ означает еще одну буквальную обратную косую черту

+? обозначение означает, что оно не жадное, оно соответствует как можно меньшему количеству символов, чтобы совместить все. В противном случае он попытается сопоставить все.

  • 0
    Ваше объяснение частей регулярного выражения не совпадает с регулярным выражением. В частности, $ - это не начало строки ^ (как у вас есть в регулярном выражении), и вы не используете .+? в регулярном выражении.
  • 0
    О чем ты говоришь? Ни в одном из моих регулярных выражений нет ни $, ни регулярного выражения OP.
Показать ещё 3 комментария
2

Вы можете использовать это регулярное выражение:

Regex regex = new Regex(@"(?<=\\\\)[^\\]*(?=\\)");

Демо-версия RegEx

  • 1
    Спасибо! это прекрасно работает! Я решил пойти с более общим решением хоста Uri.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню