从String Java提取葡萄牙语中的日期

时间:2018-12-27 13:05:04

标签: java string parsing extract date-parsing

我想从一个字符串中提取数据,有时这个字符串会以不同的方式出现。例如,它可以是以下任意一种:

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);

2 个答案:

答案 0 :(得分:1)

首先使用正则表达式在字符串中查找日期,然后使用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(前后带有空格),四到九个小写字母的月份名称,包括ç,如{{1} }(三月),março又是四位数的年份。

您可能希望从解析中捕获de,甚至可能再次尝试DateTimeParseException,以查看实际日期是否在字符串的后面。

答案 1 :(得分:1)

@Ole建议的one的另一种方法。

该方法按原样从字符串获取数据,而无需将其转换为date对象。

代码

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

查看实际操作here