0

おおよそ次のようなファイル名のリストがあります:Gadget1-010912000000-020912235959.csv、つまり、データの期間を示す2つの日付が含まれています。

ユーザーは、日付形式とファイル形式を入力します。

  • この場合のファイル形式:* GADGET *-* DATE_FROM *-* DATE_TO * .csv
  • この場合の日付形式:ddMMyyHHmmss

私がやりたいのは、指定されたファイルと日付形式でファイル名から3つの値を抽出することです。

私の問題は次のとおりです。日付の形式は大きく異なる可能性があるため(時間、分、秒はコロンで区切ることができ、日付はドットで区切ることができます...)、適切な正規表現を作成する方法がよくわかりません。

4

4 に答える 4

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) {
}

それが役に立てば幸い。

于 2012-09-05T14:01:36.043 に答える
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());

最も重要な部分はラインです

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]

ここでは、正規表現を定義し、paranthesisでグループを([0-9]{2})マークして、グループをマークします。次に[\\.]*、この場合は0または1ドットの可能なデリメータの式ですが、たとえば、より多くの可能なデリメータを配置できます[\\.|\]{0,1}

次にmatcher.find()、パターンが一致した場合にtrueを返す実行を実行します。そして、を使用しmatcher.group(int)て、グループごとに取得できます。最初のグループのインデックスは1であることに注意してください。

String次に、を使用してクリーンな日付を作成しStringBuilderます。そして、日付を解析します。

乾杯、ミハル

于 2012-09-05T14:19:51.990 に答える
0

SimpleDateFormatは問題を解決します。カンマやスペースなどを使用して形式を定義し、形式に従って単純に解析できます。

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

したがって、フォーマット(ddMMyyHHmmssなど)を対応するSimpleDateFormatにマップします。

SimpleDateFormat format = new SimpleDateFormat("ddMMyyHHmmss");
Date x = format.parse("010912000000");

フォーマットが変更された場合は、SimpleDateFormatを変更するだけです。

于 2012-09-05T13:18:04.137 に答える
0

一連の日時形式を使用して、1つが機能するまでそれぞれを試すことができます。

一致を優先するためにフォーマットを注文する必要があるかもしれません。

たとえば、Joda timeでは、一連のパターンのそれぞれにDateTimeFormat.forPattern ()およびDateTimeFormatter.getParser( )を使用できます。成功するまでDateTimeParser.parseInto()を試してください。

このアプローチの良い点の1つは、パターンの追加と削除が簡単なことです。

于 2012-09-05T13:21:50.977 に答える