Извлечение нескольких дат (формат дд-ммм-гггг) из строки в Java - PullRequest
1 голос
/ 02 июля 2019

Я искал это везде, но не смог найти какое-то конкретное решение, и в документации это тоже не освещалось. Поэтому я хочу извлечь дату начала и дату окончания из этой строки "1-Mar-2019 to 31-Mar-2019". Проблема в том, что я не могу извлечь обе строки даты.

Я нашел самое близкое решение здесь, но не смог опубликовать комментарий, спрашивающий, как извлечь значения по отдельности из-за низкой репутации: https://stackoverflow.com/a/8116229/10735227

Я использую шаблон регулярных выражений, чтобы искать вхождения и извлекать оба вхождения сначала до 2 строк.
Вот что я попробовал:

Pattern p = Pattern.compile("(\\d{1,2}-[a-zA-Z]{3}-\\d{4})");  
Matcher m = p.matcher(str);
while(m.find())
{
    startdt = m.group(1); 
    enddt = m.group(1);   //I think this is wrong, don't know how to fix it
}
System.out.println("startdt: "+startdt+" enddt: "+enddt);

Вывод:

startdt: 31-Mar-2019 enddt: 31-Mar-2019

Кроме того, мне нужно использовать DateFormatter для преобразования строки в дату (добавляя завершающий 0 перед датой из одной цифры, если требуется).

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Вы можете поймать обе даты, просто дважды вызвав метод find, если у вас есть только одна, то будет записана только первая:

String str = "1-Mar-2019 to 31-Mar-2019";

String startdt = null, enddt = null;

Pattern p = Pattern.compile("(\\d{1,2}-[a-zA-Z]{3}-\\d{4})");  
Matcher m = p.matcher(str);
if(m.find()) {
    startdt = m.group(1); 
    if(m.find()) {
       enddt = m.group(1);
    }
}   
System.out.println("startdt: "+startdt+" enddt: "+enddt);

Обратите внимание, что это можно использовать с while(m.find()) и List<String, чтобы иметь возможность извлекать каждую дату, которую вы можете найти.

1 голос
/ 02 июля 2019

Если ваш текст может быть грязным, и вам действительно нужно использовать регулярное выражение для извлечения диапазона дат, вы можете использовать

String str = "Text here 1-Mar-2019 to 31-Mar-2019 and tex there";
String startdt = "";
String enddt = "";

String date_rx = "\\d{1,2}-[a-zA-Z]{3}-\\d{4}";
Pattern p = Pattern.compile("(" + date_rx + ")\\s*to\\s*(" + date_rx + ")");  
Matcher m = p.matcher(str);
if(m.find())
{
    startdt = m.group(1); 
    enddt = m.group(2); 
}
System.out.println("startdt: "+startdt+" enddt: "+enddt);
// => startdt: 1-Mar-2019 enddt: 31-Mar-2019

См. Java демо

Также рассмотрим это улучшение: сопоставьте дату как целое слово, чтобы избежать частичного совпадения в более длинных строках:

Pattern.compile("\\b(" + date_rx + ")\\s*to\\s*(" + date_rx + ")\\b")

Если диапазон можно выразить с помощью - или to, вы можете заменить to на (?:to|-) или даже (?:to|\\p{Pd}), где \p{Pd} соответствует любой дефис / тире.

0 голосов
/ 02 июля 2019

Вы можете просто использовать String::split

String range = "1-Mar-2019 to 31-Mar-2019";
String dts [] = range.split(" ");
System.out.println(dts[0]);
System.out.println(dts[2]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...