#java #string #split
#Ява #строка #расщеплять
Вопрос:
У меня есть файл .txt, который я просматриваю в буфере чтения, и мне нужно извлечь последний символ из этой строки, я оставляю строку ниже
lt;path action="m" text-mod="true" mods="true" kind="file"gt;branches/RO/2021Align01/CO/DGSIG-DAO/src/main/java/eu/ca/co/vo/CsoorspeWsVo.javalt;/pathgt;
У меня есть следующий код, который занимает всю мою строку и помещает ее в список, но мне это просто нужно Cs00rspeWsVo
while ((line = bufferdReader.readLine()) != null) { Excel4 excel4 = new Excel4(); if (line.contains("lt;/pathgt;")) { int index1 = line.indexOf("gt;"); int index2 = line.lastIndexOf("lt;"); line = line.substring(index1, index2); excel4.setName(line); listExcel4.add(excel4); } }
и я только хочу извлечь Cs00rspeWsVo отсюда. кто-нибудь может мне помочь? Спасибо
Комментарии:
1. Отправленный вами код не компилируется, в
index2
строке отсутствует полулокон. Пожалуйста, не забудьте опубликовать правильный код и дважды проверьте, нет ли других проблем.2. Конкретная проблема в вашем коде здесь заключается в том, что вы объявляете
int index1
внутри областиif
блока, но затем пытаетесь ссылаться на него за пределами if. Тем не менее, использование XML-данных, подобных этому, не обязательно является лучшим подходом: проанализируйте их должным образом, чтобы извлечь данные.3. То, что вы делаете, довольно банально, но, честно говоря, если вы уже используете этот подход, почему бы просто не поискать предпоследний индекс
/
, а затем извлечь его оттуда. Итак , подстрока от предпоследней/
до последнейlt;
, тогда она у вас есть.int lastSlash = text.lastIndexOf("/")
, тогдаint secondToLastSlash = text.lastIndexOf("/", lastSlash)
, тогда с вашим существованиемindex2
и у вас естьtext.substring(secondToLastSlash, index2)
. Или просто работаешь со своим текущимline
line.substring(line.lastIndexOf("/"))
.4. Я бы предложил либо подстроку от последнего » / » до последнего «c», либо использовать регулярное выражение.
5. Вы также можете интерпретировать путь как
Path
, а затем использовать его методы высокого уровня. Так что что-то похожееPath.of(line).getFileName()
или похожее.
Ответ №1:
Вы можете использовать группы регулярных выражений, чтобы получить его, например
public static void main(String []args){ String input = "lt;pathn" " action="m"n" " text-mod="true"n" " mods="true"n" " kind="file"gt;branches/RO/2021Align01/CO/DGSIG-DAO/src/main/java/eu/ca/co/vo/CsoorspeWsVo.javalt;/pathgt;n"; Pattern pattern = Pattern.compile("kind="file"gt;. /(. \.. )lt;/pathgt;"); Matcher matcher = pattern.matcher(input); if (matcher.find()) { String fileName = matcher.group(1); System.out.println(fileName); } }
Результат будет -gt; CsoorspeWsVo.java
и если вы хотите, чтобы путь заполнения изменил регулярное выражение на
Pattern pattern = Pattern.compile("kind="file"gt;(. )lt;/pathgt;");
Результатом будет:
branches/RO/2021Align01/CO/DGSIG-DAO/src/main/java/eu/ca/co/vo/CsoorspeWsVo.java
И вы можете получить имя и расширение в двух группах, например
Pattern pattern = Pattern.compile("kind="file"gt;. /(. )\.(. )lt;/pathgt;");
И внутри, если
String fileName = matcher.group(1); String fileExtension = matcher.group(2);