Добавьте двоеточие к пути к файлу после буквы диска (то есть: изменить /c/ или c / на c:/) в Java

По сути, я получаю путь к файлу из строки внутри CSV-файла. Однако по какой-то причине программа, генерирующая CSV-файл, удаляет двоеточие из строки, поэтому я получаю путь к файлу, который не работает внутри Java. Типичный результат /x/Rest/Of/Path где х - буква диска, но иногда может быть x/ вместо /x/, По сути, мне нужно добавить двоеточие после буквы диска, если его еще нет; меняется либо /x/ или же x/ в x:/, Я уверен, что это в основном делается с помощью регулярных выражений, но я все еще пытаюсь сам разобраться в основах регулярных выражений, поэтому я не уверен, как это написать. Заранее благодарю за любую помощь.

1 ответ

Решение

Вот, попробуйте это, и изучите это, чтобы узнать, как это работает:

String path = "/C/Rest/Of/Path";
Pattern p = Pattern.compile("^(/?[CDEFGH])/");
Matcher m = p.matcher(path);
String pathWithColon = m.replaceAll("$1:/");

Вот руководство:

  1. ^ известен как якорь. Это соответствует самому началу строки. Без этого это регулярное выражение также будет соответствовать /foo/C/Rest/Of/Path и мы этого не хотим.
  2. ? может означать разные вещи, в зависимости от того, где он появляется. Если это не сразу следует открывающая скобка (, не следует сразу за квантификатором *, +, другой ?, {n}, {m,n}, не появляется внутри класса персонажа [] и не избежал \? тогда это квантор, означающий "0 или 1 предыдущего объекта", в данном случае /, Думайте об этом как о "необязательном" операторе.
  3. [CDEFGH] известен как класс персонажа. Это означает: "Любой из этих персонажей". Вы можете отменить класс символов следующим образом: [^CDEFGH]; это будет означать: "Любой персонаж, но не эти". Если вы хотите принять любую заглавную букву, вы можете использовать диапазон: [A-Z], Если вы хотите принять любое письмо, то: [a-zA-Z],
  4. Скобки, окружающие большую часть регулярного выражения, известны как группа захвата или группа захвата. Это "сохраняет" все, что "поймано" между ними.
  5. Во время замены вы можете ссылаться на "сохраненные" (захваченные) группы по $1, $2, $3, и так далее. (Таким образом, вы можете захватить более одной группы; каждая группа захвата пронумерована по порядку открывающей скобки.) В приведенном выше примере обратите внимание, что я захватил /? также, если бы существовала косая черта, то она бы существовала и в выходных данных, а если нет, то нет.

Счастливого обучения!

РЕДАКТИРОВАТЬ

Я должен был привести пример более простого подхода к началу. Мои извенения. Это также будет делать:

String path = "/C/Rest/Of/Path";
path = path.replaceAll("^(/?[CDEFGH])/", "$1:/");

Использование скомпилированного шаблона только увеличивает эффективность. Например, если вы собираетесь заменить массив из 10000 путей, вы должны скомпилировать шаблон один раз, а затем использовать средство сравнения для замены каждого пути в цикле. (Без компиляции движок в конечном итоге вынужден анализировать шаблон с нуля для каждого найденного пути.)

Другие вопросы по тегам