检查Java字符串中是否存在时间

时间:2014-06-15 08:43:39

标签: java regex string time jsoup

我有一个String变量,其中包含一些带有时间的文本。 例如,

// string str looks like this
String str = "XYZ SuperMarket 10.00AM - 10.00PM"
  1. 是否有方法或库可以用来检查此字符串是否为 由时间组成(像 Jsoup或Regex )?

  2. 我想缩短时间内容&将其存储在名为" 时间"的不同字符串中。是否真的可以处理字符串 方式。

2 个答案:

答案 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

ONLINE DEMO