我有一个String变量,其中包含一些带有时间的文本。 例如,
// string str looks like this
String str = "XYZ SuperMarket 10.00AM - 10.00PM"
是否有方法或库可以用来检查此字符串是否为 由时间组成(像 Jsoup或Regex )?
我想缩短时间内容&将其存储在名为" 时间"的不同字符串中。是否真的可以处理字符串 方式。
答案 0 :(得分:1)
我对Java编程一无所知,因此无法为此任务提供Java代码。
但我可以提供以下正则表达式:
((?:[01][0-9]|[0-9])(?:[.:][0-5][0-9]){0,2} ?[AP]M)
(
... )
在整个表达式的开头和结尾标记整个找到的字符串,可能需要将找到的字符串转换为字符串变量。
(?:[01][0-9]|[0-9])
是OR表达式的非标记组。此OR表达式找到一个数字,其中2位数字的范围为00到19,或者只找到0到9范围内的单个数字。(是的,大于12的数字也匹配,但这有关系吗?我想,它没有。保持它很简单意味着快速。)
(?:[.:][0-5][0-9]){0,2}
是一个非标记组,应用于字符串以搜索0,1或2次。它将分钟和秒与分隔符匹配,在分隔符之间可以是点或冒号。分钟/秒必须有2位数字,范围为00到59.(因此,这个表达式不适用于具有值60的闰秒,但我确定你从未见过闰秒的时间。)所以时间字符串可以只有小时,或小时+分钟,或小时+分钟+秒。由于我从未在一小时后看到一个数字分钟或秒的时间字符串,因此2位数分钟/秒的限制应该不是问题。
?
匹配单个空格,但可能在时间字符串中不存在。
[AP]M
匹配 AM 或 PM ,因为它看起来像是您在搜索字符串中所期望的时间格式。
注意:有许多不同的时间格式。因此,检查所有可能时间格式的字符串将需要许多正则表达式。
答案 1 :(得分:0)
您可以使用 regex、\d{1,2}(?:[.:]\d{1,2})?\s*(?i)[AP]M\s*-\s*\d{1,2}(?:[.:]\d{1,2})?\s*[AP]M
从文本中检索时间段。
正则表达式的解释:
\d{1,2}
:一位或两位数字(?:
:非捕获组的开始
[.:]
:方括号括起来的字符之一\d{1,2}
:一位或两位数字)
:非捕获组结束?
:使前一个标记(在本例中为非捕获组)可选\s*
:零个或多个空白字符(?i)
:使以下标记不区分大小写[AP]
:方括号括起来的字符之一M
:字符字面量,M
\s*
:零个或多个空白字符-
:字符字面量,-
正则表达式的其余部分已经在上面解释过了。
演示:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
// Test
String str = "XYZ SuperMarket 10.00AM - 10.00PM";
System.out.println(getTimeSlot(str));
}
static String getTimeSlot(String str) {
Matcher matcher = Pattern
.compile("\\d{1,2}(?:[.:]\\d{1,2})?\\s*(?i)[AP]M\\s*-\\s*\\d{1,2}(?:[.:]\\d{1,2})?\\s*[AP]M")
.matcher(str);
String timeSlot = "";
if (matcher.find()) {
timeSlot = matcher.group();
}
return timeSlot;
}
}
输出:
10.00AM - 10.00PM