2012-09-05 6 views
0

다음과 같은 파일 이름 목록이 있습니다 : Gadget1-010912000000-020912235959.csv 즉, 데이터의 시간 간격을 나타내는 두 개의 날짜가 있습니다. 이 경우문자열에서 날짜 추출하기

  • 파일 형식 :

    사용자는 날짜 형식 및 파일 형식을 입력 * GADGET * - * DATE_FROM * -이 경우 * DATE_TO * .CSV

  • 날짜 형식 : ddMMyyHHmmss을

내가 원하는 것은 주어진 파일 및 날짜 형식으로 파일 이름에서 3 개의 값을 추출하는 것입니다.

내 문제는 다음과 같습니다. 날짜 형식이 크게 다를 수 있기 때문에 (시간, 분 및 초는 콜론, 점으로 구분할 수 있습니다 ...) 피팅 일반 표현식을 만드는 방법을 알지 못합니다. .

+0

, 경향이 어렵고 오류가 될 것입니다. – assylias

+0

날짜 형식에 대한 더 많은 예제를 제공 할 수 있습니까? 소유하고있는 모든 사건을 다루는 것이 가장 좋습니다. – nhahtdh

+0

모든 변형을 공통 형식으로 정규화해야합니다. 오직 당신 만이 모든 유사 콘텐츠가 무엇이며 어떻게 변형시킬 수 있는지 알고 있습니다. –

답변

1

정규식을 사용하여 숫자가 아닌 문자를 제거한 다음 값을 구문 분석 할 수 있습니다.

DateFormat dateFormat = new SimpleDateFormat("ddMMyyHHmmss"); 

String[] fileNameDetails = ("Gadget1-010912000000-020912235959").split("-"); 

/*Catch All non digit characters and removes it. If non exists maintains original string*/ 
String date = fileNameDetails[1].replaceAll("[^0-9]", ""); 

try{ 
    dateFormat.parse(fileNameDetails[1]); 
}catch (ParseException e) { 
} 

희망이 있습니다.

0

SimpleDateFormat이 문제를 해결합니다. 쉼표, 공간과 어떤과 형식을 정의하고 단순히 형식에 따라 구문 분석 할 수 있습니다 :

http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html

그래서 당신이 대응하여 SimpleDateFormat에 형식 (예를 들어, ddMMyyHHmmss)를 매핑합니다.
SimpleDateFormat format = new SimpleDateFormat("ddMMyyHHmmss"); 
Date x = format.parse("010912000000"); 

은 형식 변경하는 경우, 당신은 단순히 당신이 하나가 작동 할 때까지 각 시도, 날짜 - 시간 형식의 시리즈를 사용할 수있는 SimpleDateFormat의

0

을 변경합니다.

일치하는 항목의 우선 순위를 지정하려면 형식을 지정해야 할 수 있습니다.

예를 들어 Joda 시간을 사용하면 일련의 패턴 각각에 DateTimeFormat.forPattern()DateTimeFormatter.getParser()을 사용할 수 있습니다. 성공할 때까지 DateTimeParser.parseInto()으로 시도하십시오.

이 접근법에 대한 좋은 점 중 하나는 패턴을 추가하고 제거하는 것이 쉽다는 것입니다.

0

PatternMatcher 클래스를 사용하십시오. 이 예에서

봐 :

String inputDate = "01.09.12.00:00:00"; 
Pattern pattern = Pattern.compile(
    "([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})"); 
    Matcher matcher = pattern.matcher(inputDate); 
    matcher.find(); 
    StringBuilder cleanStr = new StringBuilder(); 
    for(int i = 1; i <= matcher.groupCount(); i++) { 
    cleanStr.append(matcher.group(i)); 
    } 
    SimpleDateFormat format = new SimpleDateFormat("ddMMyyHHmmss"); 
    Date x = format.parse(cleanStr.toString()); 
    System.out.println(x.toString()); 

가장 중요한 부분은 여기에 정규 표현식을 정의하고 paranthesis에서 그룹을 표시

Pattern pattern = Pattern.compile(
    "([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[\\.]{0,1}([0-9]{2})[:]{0,1}([0-9]{2})[:]{0,1}([0-9] 

그래서 ([0-9]{2}) 그룹을 표시 라인

입니다. 가능한 경우 디 리미터 [\\.]*에 대한 표현이 0 또는 1 도트이지만 가능하면 더 많은 디 리 미터를 넣을 수 있습니다 (예 : [\\.|\]{0,1}).

그런 다음 matcher.find()을 실행하면 패턴이 일치하면 true를 반환합니다.그리고 matcher.group(int)을 사용하면 그룹별로 그룹을 얻을 수 있습니다. 첫 번째 그룹의 인덱스는 1입니다.

String 다음으로 StringBuilder을 사용하여 정리 날짜를 만듭니다. 그런 다음 날짜를 파싱합니다.

건배, 원래의 날짜 형식가 해결되지 않은 경우 마이클

관련 문제