如何从java中的时间句子中提取分钟数?e、 g xx小时xx分钟
我知道这个标题令人困惑,但我想不出更好的了 假设我有一个字符串,看起来像如何从java中的时间句子中提取分钟数?e、 g xx小时xx分钟,java,Java,我知道这个标题令人困惑,但我想不出更好的了 假设我有一个字符串,看起来像([number]hr(s))[number]min(s) 例如1分钟,15分钟,3小时50分钟,1小时15分钟,4小时1分钟等 如何有效地从这些字符串中提取分钟数?我希望它也考虑到小时,因此3小时50分钟将产生230。我唯一能想到的就是使用大量的if子句和regex,但我想知道是否有更有效的方法。如果您的时间是X小时Y分钟 String time = "3 hrs 10 min"; String[] parts = tim
([number]hr(s))[number]min(s)
例如1分钟
,15分钟
,3小时50分钟
,1小时15分钟
,4小时1分钟
等
如何有效地从这些字符串中提取分钟数?我希望它也考虑到小时,因此
3小时50分钟
将产生230
。我唯一能想到的就是使用大量的if子句和regex,但我想知道是否有更有效的方法。如果您的时间是X小时Y分钟
String time = "3 hrs 10 min";
String[] parts = time.split(" ");
int total = Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[2]);
这个等待将给你一个小时的字符串,乘以60分钟,再加上分钟。如果你只需要几分钟,那就只需参与其中[2]
如果你的时间是X小时Y分钟,你也可以使用正则表达式
String time = "3 hrs 10 min";
String[] parts = time.split(" ");
int total = Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[2]);
这个等待将给你一个小时的字符串,乘以60分钟,再加上分钟。如果你只需要几分钟,那就只需参与其中[2]
您也可以使用正则表达式这里有一个正则表达式解决方案:
((\d+)\s*(hours|hrs|hr|h)\s*)?(\d\d?)\s*(minutes|mins|min|m)
分钟数:
minutes = $1 * 60 + $4
规则:
- 你必须提供分钟,即使是一个小时
- 您可以省略小时,因此
相当于1分钟
0小时1分钟
- 如果模式不匹配,则格式无效
- 为获得最佳结果,请使用不区分大小写的匹配(通常
选项)i
操场:这里有一个正则表达式解决方案:
((\d+)\s*(hours|hrs|hr|h)\s*)?(\d\d?)\s*(minutes|mins|min|m)
分钟数:
minutes = $1 * 60 + $4
规则:
- 你必须提供分钟,即使是一个小时
- 您可以省略小时,因此
相当于1分钟
0小时1分钟
- 如果模式不匹配,则格式无效
- 为获得最佳结果,请使用不区分大小写的匹配(通常
选项)i
操场:您可以使用以下代码,希望对您有所帮助
String time="3 hrs 50 mins";
String[] array = time.split(" ");
int minutes = 0;
if(array.length>2){ // if it has minute and hour content
minutes = Integer.parseInt(array[0])*60 + Integer.parseInt(array[2]);
} else{ // if time has only minute content
minutes = Integer.parseInt(array[0]);
}
您可以使用以下代码,希望对您有所帮助
String time="3 hrs 50 mins";
String[] array = time.split(" ");
int minutes = 0;
if(array.length>2){ // if it has minute and hour content
minutes = Integer.parseInt(array[0])*60 + Integer.parseInt(array[2]);
} else{ // if time has only minute content
minutes = Integer.parseInt(array[0]);
}
另一种方法为您提供了更大的灵活性:
public long getMinutes(String input) {
input = input.toLowerCase()
.replaceAll("mins?", "M")
.replaceAll("hrs?", "H")
.replaceAll("\\s+", "");
Duration d = Duration.parse("PT" + input);
return d.toMinutes();
}
()
样本数据的输出:
1 min: 1
15 mins: 15
3 hrs 50 mins: 230
1 hr 15 mins: 75
4 hrs 1 min: 241
基本思想是将您的输入转换为Java方法(PTHM
)支持的字符串,然后让它发挥神奇的作用。最终会得到一个Duration
对象,该对象提供了以后处理它的各种方法
请注意,这将打印230
,打印时间为3小时50分钟
。如果您只需要50
,那么简单的正则表达式将是更简单的方法
(在生产代码中,我会将各种
replaceAll
调用合并为一个调用,并将toLowerCase
替换为不区分大小写的模式匹配,以提高效率。为了更好地理解,将其明确保留在此处。)另一种方法为您提供了更大的灵活性:
public long getMinutes(String input) {
input = input.toLowerCase()
.replaceAll("mins?", "M")
.replaceAll("hrs?", "H")
.replaceAll("\\s+", "");
Duration d = Duration.parse("PT" + input);
return d.toMinutes();
}
()
样本数据的输出:
1 min: 1
15 mins: 15
3 hrs 50 mins: 230
1 hr 15 mins: 75
4 hrs 1 min: 241
基本思想是将您的输入转换为Java方法(PTHM
)支持的字符串,然后让它发挥神奇的作用。最终会得到一个Duration
对象,该对象提供了以后处理它的各种方法
请注意,这将打印230
,打印时间为3小时50分钟
。如果您只需要50
,那么简单的正则表达式将是更简单的方法
(在生产代码中,我会将各种
replaceAll
调用合并为一个调用,并将toLowerCase
替换为不区分大小写的模式匹配,以提高效率。为了更好地理解,这里将其显式保留。)用空格分隔字符串怎么样?您应该花一些时间来查看。你可能会自己想出一些东西……如果你只对小时的一小部分感兴趣,那么你对3小时50分钟
-50
或230
会有什么期望呢?正则表达式(\d+\s+min?
会捕获你所有的例子。我将把它留作一个练习,让您在Java中实现它。您可以添加测试输入和预期输出吗???用空格分隔字符串如何?您应该花一些时间来检查测试提供的许多方法。你可能会自己想出一些东西……如果你只对小时的一小部分感兴趣,那么你对3小时50分钟
-50
或230
会有什么期望呢?正则表达式(\d+\s+min?
会捕获你所有的例子。我将把它留作一个练习,让您在Java中实现它。您可以添加测试输入和预期输出吗???除了这段代码不会编译之外,如果只给它几分钟,它就不会工作。这段代码似乎是用python和Java的混合体编写的。Java是静态类型的!!更新!我在想打字,却忘了写。谢谢你的评论,只给了他一个例子,我想他可以通过文档找到答案,搜索split除了这段代码不会编译之外,如果只给几分钟就不会工作。这段代码似乎是用python和Java的混合体编写的。Java是静态类型的!!更新!我在想打字,却忘了写。谢谢你的评论,并且只给了他一个例子,我想他可以通过doc找到答案,搜索持续时间。小的改进建议:在替换任何内容之前,对输入字符串使用toLowerCase()
。通过这种方式,此算法还将支持Hrs
、Hrs
或Mins
@HubertGrzeskowiak:Done,谢谢!ItamarG3:也谢谢你-我更进一步,把点对齐了。非常好地使用了持续时间。小的改进建议:在替换任何内容之前,对输入字符串使用toLowerCase()
。这样,这个算法也将支持语法l