2013-09-03 8 views
7

Próbuję wyodrębnić 2 pochodzi z łańcucha przy użyciu regex- iz jakiegoś powodu - nie regex wyodrębnić dates- to mój kod:Java - data ekstrakt z łańcucha przy użyciu regex- braku

private String[] getDate(String desc) { 
    int count=0; 
    String[] allMatches = new String[2]; 
    Matcher m = Pattern.compile("(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d(?:,)").matcher(desc); 
    while (m.find()) { 
     allMatches[count] = m.group(); 
    } 
    return allMatches; 
} 

Moja String wzorzec jest: "coming from the 11/25/2009 to the 11/30/2009" i wrócę null tablicę ...

+3

Twój regex jest dla formatu 'dd-mm-yyyy', a łańcuch ma' MM-DD-RRRR '. Rozwiązanie: potrzebujesz wszędzie spójnego formatu, co nie zawsze jest możliwe przy wprowadzaniu danych przez użytkownika. Nie możesz zaakceptować obu, ponieważ nie wiesz, co to jest "01-02-2013" ... – Kobi

+0

+1 Kobi. Nie powinieneś także zapomnieć o inkrementacji "count". –

Odpowiedz

2

masz miesiąc i dzień miesiąca wstecz i (?:,) jest wymagająca przecinek na końcu każdy dzień. Spróbuj to zamiast:

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d\\d 
10

Twój regex mecze dzień, a potem miesiąc (DD/MM/RRRR), podczas gdy twoi wejścia początek miesiąca, a następnie dzień (MM/DD/YYYY).

Co więcej, po Twoich datach musi następować przecinek (część (?:,)).

Ten powinien własnych potrzeb:

(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d 

Regular expression visualization

Diagram przez Debuggex.

6

3 Problemy:

1) Próbujesz datę w formacie dd/MM/YYYY gdzie jako regex ma format MM/dd/YYYY analizować.

2) W pętli while zapomniałeś podkręcić count.

3) Część (?:,) na końcu wyrażeń regularnych jest bezużyteczna.

Te kody działa na moim komputerze:

private static String[] getDate(String desc) { 
    int count=0; 
    String[] allMatches = new String[2]; 
    Matcher m = Pattern.compile("(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\\d\\d").matcher(desc); 
    while (m.find()) { 
    allMatches[count] = m.group(); 
    count++; 
    } 
    return allMatches; 
} 

testowym:

public static void main(String[] args) throws Exception{ 
    String[] dates = getDate("coming from the 25/11/2009 to the 30/11/2009"); 

    System.out.println(dates[0]); 
    System.out.println(dates[1]); 

} 

Wyjście:

25/11/2009 
30/11/2009 
+0

Można zbudować wyrażenie regularne w https://www.debuggex.com/r/VPIR1fOPhqZ_NIo1#cheatsheet – Doberon

0

Algorytm data rozpoznawanie wzorców nie tylko zidentyfikować datę wzór ale także pobiera prawdopodobną datę w formacie daty Java. Ten algorytm jest bardzo szybki i lekki. Czas przetwarzania jest liniowy, a wszystkie daty są identyfikowane w jednym przebiegu. Algorytm rozpatruje datę za pomocą mechanizmu drzewa. Struktury danych drzewa są tworzone niestandardowo w celu tworzenia obsługiwanych wzorców daty, czasu i miesiąca.

Algorytm potwierdza również wiele znaków spacji między literałami daty. Na przykład. DD DD DD i DD DD DD uważa się za ważne daty.

Następujące wzorce daty są uważane za prawidłowe i można je zidentyfikować za pomocą tego algorytmu.

dd MM (MM) rr (rr) rr (rr) MM (MM) dd mm (MM) dd yy (yy)

gdzie M oznacza miesiące dosłowny jest w formacie alfabet jak Jan lub styczniu

Dopuszczalne separatory między datami to "/", "\", "", ",", "|", "-", ""

Rozpoznaje również wzór czasu końcowego w następującym formacie hh (24): mm : ss.SSS am/pm hh (24): mm: ss am/pm hh (24): mm: ss am/pm

Rozdzielczość jest liniowa, nie stosuje się dopasowania wzoru ani siły brutalnej. Algorytm ten opiera się na przechodzeniu drzewa i zwraca z powrotem listę dat z następującymi trzema składnikami - ciąg daty określony w tekście - przekształcony & sformatowany ciąg daty - SimpleDateFormat

Korzystanie z łańcucha daty i ciągu formatów, użytkownicy mogą przekonwertuj ciąg na obiekty na podstawie ich wymagań.

Biblioteka algorytmów dostępna jest w centralnym systemie.

<dependency> 
    <groupId>net.rationalminds</groupId> 
    <artifactId>DateParser</artifactId> 
    <version>0.3.0</version> 
</dependency> 

Przykładowy kod do użycia znajduje się poniżej.

import java.util.List; 
import net.rationalminds.LocalDateModel; 
import net.rationalminds.Parser; 
public class Test { 
    public static void main(String[] args) throws Exception { 
     Parser parser=new Parser(); 
     List<LocalDateModel> dates=parser.parse("Identified date :'2015-January-10 18:00:01.704', converted"); 
     System.out.println(dates); 
    } 
} 

wyjściowe: [LocalDateModel {originalText = 2015, styczeń, 10: 18: 00: 01,704, dateTimeString 10.01.2015 = 18: 00: 01,704, conDateFormat = rrrr MM-dd HH: MM: SS .SSS rozpocząć = 18, koniec = 46}]

Szczegółowy strony na http://coffeefromme.blogspot.com/2015/10/how-to-extract-date-object-from-given.html

pełna sieć jest dostępna na GitHub w https://github.com/vbhavsingh/DateParser

+0

Czy to ten sam użytkownik? https://stackoverflow.com/users/7932978/vaibhav-singh – Pang

+0

Witam serdecznie! Wydaje mi się, że w twoim poście zaginęło formatowanie, ponieważ przykłady "DD DD DD" i "DD DD DD" wyglądają identycznie w drugim akapicie. Może użyć więcej znaczników 'code', aby zachować przestrzenie i formaty wyświetlania? – thinkOfaNumber

+0

jego "DD DD DDDD" lub "DDDD DD DD" lub "DD DD DD" –

0

LocalTime.parse zamiast regex

Regex może być przesadzony za taki problem.

Można po prostu podzielić ciąg znaków na znak SPACE i spróbować przeanalizować każdy element jako LocalDate. Jeśli analiza nie powiedzie się, przejdź do następnego elementu.

String input = "coming from the 11/25/2009 to the 11/30/2009" ; 
String[] elements = input.split(" ") ; 
DateTimeFormatter f = DateTimeFormatter.ofPattern("MM/dd/uuuu") ; 
List<LocalDate> dates = new ArrayList<>() ; 
for(String element : elements) { 
    try { 
     LocalDate ld = LocalDate.parse(element , f) ; 
     dates.add(ld) ; 
    } catch (DateTimeParseException e) { 
     // Ignore the exception. Move on to next element. 
    } 
} 
System.out.println("dates: " + dates) ; 

Zobacz to code run live at IdeOne.com.

daty: [2009-11-25, 2009-11-30]

Powiązane problemy