Я хотел бы извлечь данные из строки, и эта строка иногда отображается по-разному. Например, это может быть любое из следующего:
Portaria n° 200, 28 de janeiro de 2018.
Portaria n° 200, 28 de janeiro de 2018 da Republica Brasileira.
Portaria n° 200 28 de janeiro de 2018.
Portaria n° 200 2017/2018 de 28 de janeiro de 2018.
Нет рисунка. Я пробовал xsplit: в некоторых случаях он работает, но не всегда.
String receberTextoIdentifica = (xmlUtil.xpathElement(documentOrigem, Constantes.GETIDENTIFICACAO).getTextContent());
LocalDateTime receberDataEnvio = materiaDto.getDataEnvio();
Integer receberDataEnvioAno = receberDataEnvio.getYear();
if (receberTextoIdentifica != null && receberTextoIdentifica.toLowerCase().contains("" + receberDataEnvioAno)) {
Element dataTexto = documentDestino.createElement("dataTexto");
estruturas.appendChild(dataTexto);
receberTextoIdentifica = receberTextoIdentifica.substring(0, receberTextoIdentifica.indexOf("" + receberDataEnvioAno) + 4);
String words[] = receberTextoIdentifica.split(" ");
String lastFive = words[words.length - 5] + " " + words[words.length - 4] + " " + words[words.length - 3] + " "
+ words[words.length - 2] + " " + words[words.length - 1];
dataTexto.setTextContent(lastFive);
Я хочу извлечь дату "28 de janeiro de 2018" @codelt
«28 de janeiro de 2018» всегда будет фиксированной строкой или изменится ..
Используйте String str1 = "Portaria n° 200, 28 de janeiro de 2018"; String str1_array [] = str1.split(" ");. Функция split создает массив слов из строки. Затем вы можете написать код для извлечения необходимых данных из массива строк.
@Rajas этот шаблон всегда будет одинаковым, просто изменится дата, например «24 сентября 2018 года» или «15 ноября 2017 года».
@Codelt я использую, но не работает для меня, потому что я получаю строку разными способами, поэтому у меня нет шаблона
@PhilippeSousa Создайте еще один массив строк с названиями месяцев на португальском языке. Прокрутите каждое слово в результирующем массиве строк, полученном с помощью функции разделения, и сопоставьте его с названиями месяцев. Когда вы найдете совпадение, возьмите этот номер индекса. и создать строку, объединяющую str[index-2] + str[index-1] + str[index] + str[index+1] + str[index+2]. Это, вероятно, должно вам помочь.
Вы можете изучить это: stackoverflow.com/questions/13367066/date-extraction-from-te xt
Вам нужно использовать регулярное выражение. Это даст вам представление о stackoverflow.com/questions/15491894/…




Сначала используйте регулярное выражение для поиска даты в строке, затем используйте DateTimeFormatter для разбора ее на LocalDate:
Pattern datePattern = Pattern.compile("\\d{1,2} de [a-zç]{4,9} de \\d{4}");
DateTimeFormatter portugueseDateFormatter
= DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG)
.withLocale(Locale.forLanguageTag("pt-BR"));
String[] differentStrings = {
"Portaria n° 200, 28 de janeiro de 2018.",
"Portaria n° 200, 28 de janeiro de 2018 da Republica Brasileira.",
"Portaria n° 200 28 de janeiro de 2018.",
"Portaria n° 200 2017/2018 de 28 de janeiro de 2018."
};
for (String s : differentStrings) {
Matcher m = datePattern.matcher(s);
if (m.find()) {
String dateString = m.group();
LocalDate date = LocalDate.parse(dateString, portugueseDateFormatter);
System.out.println("Date found: " + date);
} else {
System.out.println("No date found in " + s);
}
}
Выход:
Date found: 2018-01-28 Date found: 2018-01-28 Date found: 2018-01-28 Date found: 2018-01-28
Регулярное выражение принимает одну или две цифры для дня месяца, затем de (с пробелами до и после), от четырех до девяти строчных букв названия месяца, включая ç, как в março (март), de снова и четырехзначный год.
Вы, вероятно, захотите поймать DateTimeParseException при синтаксическом анализе и, возможно, даже попробовать снова find, чтобы увидеть, наступит ли реальная дата позже в строке.
Если вы откроете это заново, я смогу опубликовать альтернативное решение. repl.it/repls/SplendidEthicalObjects
@CodeIt Пожалуйста, сделайте это. Этот был на границе очень точного дубликата, поэтому я полагаю, что ваше решение здесь имеет больше смысла, чем как ответ на оригинал, на который я ссылался. Я знаю, что отвечать и закрывать - это в любом случае плохой стиль - я обнаружил оригинал только после того, как опубликовал свой ответ. Прости.
Спасибо! Размещено здесь.
Спасибо, очень помогло! Я сделал что-то очень похожее ... Matcher m = Pattern.compile ("([0-9] {1,2} \\ s + d \\ s? E? \\ s + \\ &? \\ &? [ a-zà-ü] { 4,9} \\ s + de \\ s + [0-9] { 4} \\ ,?) ", Pattern.CASE_INSENSITIVE) .matcher (ReceberTextoIdentifica);
Мне нужно включить это «28 de janeiro de 2018» в мой тег xml с месяцем. Я не могу использовать синтаксический анализ с этим форматом .... Спасибо большое !!
Просто любопытно, @PhilippeSousa, что такое \\&?\\&?? Спасибо за отчет.
Альтернативный способ один, предложенный @Ole.
Метод получает данные из строки как есть, не конвертируя их в объект даты.
Код:
import java.util.Scanner;
import java.util.Arrays;
import java.util.List;
class Main {
public static void main(String[] args) {
String[] strs = {
"Portaria n° 200, 28 de janeiro de 2018",
"Portaria n° 200, 28 de janeiro de 2018 da Republica Brasileira",
"Portaria n° 200 28 de janeiro de 2018",
"Portaria n° 200 2017/2018 de 25 de janeiro de 2018"
};
String months[] = {"janeiro", "fevereiro", "marco", "abril", "maio", "junho", "julho", "agosto", "setembro", "outubro", "novembro", "dezembro"};
int i,j;
for(i = 0; i < strs.length; i++) {
String test_array [] = strs[i].split(" ");
for (j = 3; j < test_array.length - 2; j++) {
if (Arrays.asList(months).contains(test_array[j])) {
System.out.println(test_array[j-2]+ " " + test_array[j-1]+" " +test_array[j]+ " " +test_array[j+1]+ " " +test_array[j+2]);
}
}
}
}
}
Вывод:
28 de janeiro de 2018
28 de janeiro de 2018
28 de janeiro de 2018
25 de janeiro de 2018
Смотрите это в действии здесь.
Большое спасибо!! Я попробую !!
@ OleV.V. Спасибо за вашу поддержку.
Я немного сомневаюсь в голосовании. Это, безусловно, правильный ответ. Я по-прежнему считаю, что даты лучше помещать в объекты LocalDate, а не в строки (за исключением некоторых программ типа «запустить один раз и выбросить»). В любом случае хорошо иметь разные решения для рассмотрения и выбора. Преимущество в том, что вы больше следуете методике ОП.
@ OleV.V. Вы абсолютно правы, но ОП его приняла. Фактически OP попытался использовать аналогичный метод String lastFive = words[words.length - 5] + " " + words[words.length - 4] + " " + words[words.length - 3] + " " + words[words.length - 2] + " " + words[words.length - 1];, но не смог правильно определить шаблон. У меня нет большого опыта написания java-кода, я никогда не думал о другом способе решения этой проблемы.
Какие данные вы пытаетесь извлечь из этих строк? Приведите пример.