regex 用于从字符串获取HH:MM:SS的Java正则表达式

slhcrj9b  于 2022-12-24  发布在  Java
关注(0)|答案(4)|浏览(165)

第一个月
如何使用java regex获取HH:MM:SS(01:12:22),因此输出应为01:12:22我使用了以下代码,但它不起作用

System.out.println("Hello, World!");
    String time = "Thu Dec 22 01:12:22 UTC 2022";
    String pattren = "(?:2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]";
    Pattern p = Pattern.compile(pattren);
    Matcher m = p.matcher(time);
    System.out.println("h");

    while (m.find()) {
        System.out.println(m.group(1));
    }
lokaqttq

lokaqttq1#

Regex不是适合您要求的工具

正如anubhava和Basil Bourque所建议的,这里使用的最佳工具是日期时间API。

import java.time.LocalTime;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

class Main {
    public static void main(String[] args) {
        String strDateTime = "Thu Dec 22 01:12:22 UTC 2022";
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss VV uuuu", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, parser);
        LocalTime time = zdt.toLocalTime();
        System.out.println(time);

        // Or get the string representation
        String strTime = time.toString();
        System.out.println(strTime);
    }
}
    • 输出**:
01:12:22
01:12:22
    • Ole V.V.的一条重要建议**:如果time子串的秒数为零,例如01:12:00,则LocalTime#toString的默认实现会删除尾随的:00。在这种情况下,您还需要一个格式化程序来格式化时间。
class Main {
    public static void main(String[] args) {
        String strDateTime = "Thu Dec 22 01:12:00 UTC 2022";
        DateTimeFormatter parser = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss VV uuuu", Locale.ENGLISH);
        ZonedDateTime zdt = ZonedDateTime.parse(strDateTime, parser);
        LocalTime time = zdt.toLocalTime();

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss", Locale.ENGLISH);
        String strTime = time.format(formatter);
        System.out.println(strTime);
    }
}
    • 输出**:
01:12:00

从**Trail: Date Time**了解有关现代日期-时间API的更多信息。

new9mtju

new9mtju2#

不像Basil suggested那样简单(KISS),而是使用 * Java的Time API * 详细说明Ole的评论:

使用解析器和临时查询的步骤

使用java.time.format.DateTimeFormatter.parse()方法:

String givenTime = "01:12:22";
String textWithTimeInside = "Thu Dec 22 "+ givenTime +" UTC 2022";

// create a formatter and parser for the given format
DateTimeFormatter timeParser = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz y", Locale.ROOT);

// parse the given text
var temporalParsed = timeParser.parse(textWithTimeInside);

// debug print the output of parsed Temporal (interface)
System.out.println(temporalParsed);

// extract time-part using a query
LocalTime localTime = temporalParsed.query(LocalTime::from);
System.out.println(localTime);

assert localTime.toString().equals(givenTime);

图纸:

{InstantSeconds=1671671542},ISO,UTC resolved to 2022-12-22T01:12:22
01:12:22

运行demo on IDEone

快捷方式

直接使用方法parse(CharSequence text, TemporalQuery<T> query)

LocalTime localTime = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz y", Locale.ROOT)
    .parse("Thu Dec 22 01:12:22 UTC 2022", LocalTime::from);

另请参见

Java文档:

  • TemporalQueries,各种预定义查询,例如LocalTime
  • TemporalQuery,说明查询的工作原理
xmjla07d

xmjla07d3#

正则表达式在这里是矫枉过正。

一个月

你可以简单地用空格字符分割字符串,然后取第四段文本,用索引3访问第四段文本。

String timeText = input.split( " " )[ 3 ] ;

看这个code run at Ideone.com
01时12分22秒
或者,对于commented,可以将整个字符串解析为一个 * java. time * 对象,然后提取LocalTime,有关此方法,请参见Answer by Arvind Kumar AvinashAnswer by hc_dev

bq3bfh9z

bq3bfh9z4#

如前所述回答问题。
正如OP问题的第一个注解所指出的,对group的调用存在问题,模式中没有索引为1的组。
当运行代码时,java告诉你同样的事情:

~/src $ java test.java
Hello, World!
h
Exception in thread "main" 
java.lang.IndexOutOfBoundsException: No group 1
    at java.base/java.util.regex.Matcher.group(Matcher.java:646)
    at test.main(test.java:14)

因此,无论是没有参数(如第四只鸟所建议的),还是参数为0(如下所示),代码都能正常工作:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class test {
public static void main(String[] args) {
    System.out.println("Hello, World!");
    String time = "Thu Dec 22 01:12:22 UTC 20\22";                                              
    String pattren = "(?:2[0-3]|[01][0-9]):[0-5][0-9]:[0-5][0-9]";
    Pattern p = Pattern.compile(pattren);
    Matcher m = p.matcher(time);
    System.out.println("h");

    while (m.find()) {
        System.out.println(m.group(0));
    }
    return;
}
}

相关问题