2

英語の文を次のように仮定します。

String s = "Your Last Login was 2013/10/04 13:06:45 ( 0 Days, 0 Hours, 0 Minutes )";

そして中国語の文:

String s = "您上次登录是 2013/10/04 13:06:45( 0 天, 0 小时 0 分钟 )";

試してみました

  String[] words = s.split("\\s+");
  for (int i = 0; i < words.length; i++) {
  System.out.println(words[i]);
  }

そして、私はeng文を取得します

13:10:47,829 INFO  [STDOUT] Your
13:10:47,829 INFO  [STDOUT] Last
13:10:47,829 INFO  [STDOUT] Login
13:10:47,829 INFO  [STDOUT] was
13:10:47,829 INFO  [STDOUT] 2013/10/04
13:10:47,829 INFO  [STDOUT] 13:06:45
13:10:47,829 INFO  [STDOUT] (
13:10:47,829 INFO  [STDOUT] 0
13:10:47,829 INFO  [STDOUT] Days,
13:10:47,829 INFO  [STDOUT] 0
13:10:47,829 INFO  [STDOUT] Hours,
13:10:47,829 INFO  [STDOUT] 0
13:10:47,829 INFO  [STDOUT] Minutes
13:10:47,829 INFO  [STDOUT] )

中国語の文の場合:

13:11:49,712 INFO  [STDOUT] 您上次登录是
13:11:49,712 INFO  [STDOUT] 2013/10/04
13:11:49,712 INFO  [STDOUT] 13:07:15(
13:11:49,712 INFO  [STDOUT] 0
13:11:49,712 INFO  [STDOUT] 天,
13:11:49,712 INFO  [STDOUT] 0
13:11:49,712 INFO  [STDOUT] 小时
13:11:49,712 INFO  [STDOUT] 4
13:11:49,712 INFO  [STDOUT] 分钟
13:11:49,712 INFO  [STDOUT] )

その結果、英語の文から日付、時刻、整数値を簡単に取得できます。しかし、文が中国語に変わると、同じ方法では値を取得できません。文分割後の配列の数が違っていたからです。異なる言語でも文から日付、時刻、整数値を取得する方法はありますか?文の分割後に返される配列の数は異なります。

4

4 に答える 4

1

java.time

これから紹介する 2 つのソリューションは、従来の日時 API (java.util日時型とその書式設定 API SimpleDateFormat) で動作しますが、この API は時代遅れでエラーが発生しやすいことに注意してください。使用を完全にやめてjava.time最新の日時 API *に切り替えることをお勧めします。以下に示す両方のソリューションは、java.time API を使用します。

RegEx とjava.time APIを使用したソリューション:

正規表現を使用して、\d{1,4}\/\d{1,2}\/\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}テキストから日時文字列を取得できます。リンクを調べて、RegEx とJava RegEx APIを理解することをお勧めします。次の点を参考にして、この特定の正規表現を理解できます。

  • \d{1,4}:1~4桁
  • \/: 文字リテラル、/

デモ:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
    public static void main(String[] args) {
        String english = "Your Last Login was 2013/10/04 13:06:45 ( 0 Days, 0 Hours, 0 Minutes )";
        String chinese = "您上次登录是 2013/10/04 13:06:45( 0 天, 0 小时 0 分钟 )&quot;;

        // Assuming the date-time string is in the format, yyyy/MM/dd HH:mm:ss
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu/M/d H:m:s");

        // Processing english
        LocalDateTime dt = LocalDateTime.parse(getDateTime(english), dtf);
        System.out.printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d%n", dt.getYear(),
                dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond());

        // Processing chinese
        dt = LocalDateTime.parse(getDateTime(chinese), dtf);
        System.out.printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d%n", dt.getYear(),
                dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond());
    }

    static String getDateTime(String s) {
        Matcher matcher = Pattern.compile("\\d{1,4}\\/\\d{1,2}\\/\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}").matcher(s);
        String strDateTime = "";
        if (matcher.find()) {
            strDateTime = matcher.group();
        }
        return strDateTime;
    }
}

出力:

Year: 2013, Month: 10, Day: 4, Hour: 13, Minute: 6, Second: 45
Year: 2013, Month: 10, Day: 4, Hour: 13, Minute: 6, Second: 45

ONLINE DEMO

純粋にjava.time APIを使用したソリューション:

import java.text.ParsePosition;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Optional;

public class Main {
    public static void main(String[] args) {
        String english = "Your Last Login was 2013/10/04 13:06:45 ( 0 Days, 0 Hours, 0 Minutes )";
        String chinese = "您上次登录是 2013/10/04 13:06:45( 0 天, 0 小时 0 分钟 )&quot;;

        // Processing english
        Optional<LocalDateTime> date = getDateTime(english);
        date.ifPresent(dt -> System.out.printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d%n",
                dt.getYear(), dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond()));

        // Processing chinese
        date = getDateTime(chinese);
        date.ifPresent(dt -> System.out.printf("Year: %d, Month: %d, Day: %d, Hour: %d, Minute: %d, Second: %d%n",
                dt.getYear(), dt.getMonthValue(), dt.getDayOfMonth(), dt.getHour(), dt.getMinute(), dt.getSecond()));
    }

    static Optional<LocalDateTime> getDateTime(String s) {
        // Assuming the date-time string is in the format, yyyy/MM/dd HH:mm:ss
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu/M/d H:m:s");
        
        Optional<LocalDateTime> result = Optional.empty();
        for (int i = 0; i < s.length(); i++) {
            try {
                result = Optional.ofNullable(LocalDateTime.from(dtf.parse(s, new ParsePosition(i))));
                break;
            } catch (DateTimeParseException | IndexOutOfBoundsException e) {
            }
        }
        return result;
    }
}

出力:

Year: 2013, Month: 10, Day: 4, Hour: 13, Minute: 6, Second: 45
Year: 2013, Month: 10, Day: 4, Hour: 13, Minute: 6, Second: 45

ONLINE DEMO

Trail: Date Timeから最新の日時 API *について学んでください。


* 何らかの理由で、Java 6 または Java 7 に固執する必要がある場合は、ほとんどのjava.time機能を Java 6 および 7 にバックポートするThreeTen-Backportを使用できます。Androidプロジェクトと Android API で作業している場合レベルはまだ Java-8 に準拠していません。desugarで利用できる Java 8+ APIと Android プロジェクトで ThreeTenABP を使用する方法 を確認してください。

于 2021-05-06T18:09:07.377 に答える