gpt4 book ai didi

java - 从字符串中提取一些信息 - Java + 正则表达式

转载 作者:行者123 更新时间:2023-11-29 05:30:12 24 4
gpt4 key购买 nike

我正在尝试使用正则表达式从字符串中提取一些信息。

我正在开发一个需要用户输入时间范围的程序,我需要将字符串分成每个时间单位(年、月、周、日、小时和分钟)。

字符串示例:1y30d 表示 1 年 30 天。 1y1m30mi 将是 1 年 1 个月 30 分钟

知道我该怎么做吗?我猜想用正则表达式可以做到这一点,但我从来没有真正使用过正则表达式,所以我不知道从哪里开始。

感谢您的帮助。

最佳答案

如果你想匹配这样的模式:

1y2m3d45h6mi7s

您可以使用以下正则表达式 ( online demo here ):

(?:(\d+)y)?(?:(\d+)m(?!i))?(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)mi)?(?:(\d+)s)?

如您所见,它由几个部分组成,例如 (?:(\d+)X)?,其中 X 是您想要的时间段的字符匹配。这意味着:

(?:           open parenthesis, for "non-matching group"
(\d+) any number of digits
X followed by the character 'X'
)? and everything is optional

此外,对于(?:(\d+)m(?!i))?,有一个负前瞻让它考虑 1mi 一分钟而不是一个月加上 char i(来自另一个信息,这不是日期)。

还有一些 Java 代码来处理它(online demo here):

public static void main(String[] args) throws java.lang.Exception {
parseInformation("1y30d");
parseInformation("1y2m30mi");
parseInformation("1y1mi");
parseInformation("1y2m3d4h5mi6s");
}

public static void parseInformation(String information) {
Pattern p = Pattern.compile("(?:(\\d+)y)?(?:(\\d+)m(?!i))?(?:(\\d+)d)?(?:(\\d+)h)?(?:(\\d+)mi)?(?:(\\d+)s)?");
Matcher m = p.matcher(information);
while (m.find()) {
if (m.group().isEmpty()) { continue; /* found nothing, go on */ }
System.out.println(information + " found: '"+m.group()+"'");
System.out.println("\t" + m.group(1) + " years");
System.out.println("\t" + m.group(2) + " months");
System.out.println("\t" + m.group(3) + " days");
System.out.println("\t" + m.group(4) + " hours");
System.out.println("\t" + m.group(5) + " minutes");
System.out.println("\t" + m.group(6) + " seconds");
System.out.println("");
}

输出:

...
1y2m3d4h5mi6s found: '1y2m3d4h5mi6s'
1 years
2 months
3 days
4 hours
5 minutes
6 seconds

关于java - 从字符串中提取一些信息 - Java + 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com