Добавьте двоеточие к пути к файлу после буквы диска (то есть: изменить /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:/");
Вот руководство:
-
^
известен как якорь. Это соответствует самому началу строки. Без этого это регулярное выражение также будет соответствовать/foo/C/Rest/Of/Path
и мы этого не хотим. -
?
может означать разные вещи, в зависимости от того, где он появляется. Если это не сразу следует открывающая скобка(
, не следует сразу за квантификатором*
,+
, другой?
,{n}
,{m,n}
, не появляется внутри класса персонажа[]
и не избежал\?
тогда это квантор, означающий "0 или 1 предыдущего объекта", в данном случае/
, Думайте об этом как о "необязательном" операторе. -
[CDEFGH]
известен как класс персонажа. Это означает: "Любой из этих персонажей". Вы можете отменить класс символов следующим образом:[^CDEFGH]
; это будет означать: "Любой персонаж, но не эти". Если вы хотите принять любую заглавную букву, вы можете использовать диапазон:[A-Z]
, Если вы хотите принять любое письмо, то:[a-zA-Z]
, - Скобки, окружающие большую часть регулярного выражения, известны как группа захвата или группа захвата. Это "сохраняет" все, что "поймано" между ними.
- Во время замены вы можете ссылаться на "сохраненные" (захваченные) группы по
$1
,$2
,$3
, и так далее. (Таким образом, вы можете захватить более одной группы; каждая группа захвата пронумерована по порядку открывающей скобки.) В приведенном выше примере обратите внимание, что я захватил/?
также, если бы существовала косая черта, то она бы существовала и в выходных данных, а если нет, то нет.
Счастливого обучения!
РЕДАКТИРОВАТЬ
Я должен был привести пример более простого подхода к началу. Мои извенения. Это также будет делать:
String path = "/C/Rest/Of/Path";
path = path.replaceAll("^(/?[CDEFGH])/", "$1:/");
Использование скомпилированного шаблона только увеличивает эффективность. Например, если вы собираетесь заменить массив из 10000 путей, вы должны скомпилировать шаблон один раз, а затем использовать средство сравнения для замены каждого пути в цикле. (Без компиляции движок в конечном итоге вынужден анализировать шаблон с нуля для каждого найденного пути.)