-3

我对解决此问题的最有效方法感到有些困惑。

我有一大串文本,其中某处是字符串"Wednesday, April 3, 2013 from 9:00 AM to 6:00 PM"

我知道文本将始终采用这种格式,但我需要一种从字符串中提取此信息的方法。我认为正则表达式是最好的选择,但我不知道这个字符串之前和之后会是什么,我无法匹配字符数,因为月份和日期的长度不同。字符串也可以是任意长度。

我想我的问题是,我可以在这个字符串上使用正则表达式来提取日期和时间吗?考虑到字符串可能是 1 到 10000+ 个字符,这是否是解决这个问题的有效方法?

4

3 回答 3

1

不是最短的正则表达式,但它适用于您的示例:

((Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day, January|February|March|April|May|June|July|August|September|October|November|December) \d+, \d{4} from \d+:\d+ [AP]M to \d+:\d+ [AP]M)
于 2013-04-03T16:38:56.873 回答
0

也许你可以做这样的事情:

(Sunday|Monday|...), (January|February|...) [1-9][0-9]?, \d{4}

您需要在其中完成...明显的列表(为清楚起见省略)。此外,您可以收紧日期和年份的语法,这样您就不会接受像 4 月 43 日这样的日期或像 0312 这样的年份。但是如果您可以假设输入是正确的并且您只是试图找到它,那么这些步骤是不必要的.

于 2013-04-03T16:17:53.377 回答
0

这有点宽容,但在大多数情况下应该可以工作:

String resultString = null;
try {
    Pattern regex = Pattern.compile("(\\w+,\\s+\\w+\\s+\\d{1,2},\\s+\\d{4}\\s+from\\s+\\d{1,2}:\\d{1,2}\\s+AM\\s+to\\s+\\d{1,2}:\\d{1,2}\\s+PM)",
        Pattern.CANON_EQ | Pattern.DOTALL);
    Matcher regexMatcher = regex.matcher(subjectString);
    if (regexMatcher.find()) {
        resultString = regexMatcher.group();
    } 
} catch (PatternSyntaxException ex) {
    // Syntax error in the regular expression
}

这个检查月份名称和工作日名称:

Pattern regex = Pattern.compile("((?:Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\\s+(?:January|February|March|April|May|June|July|August|September|October|November|December)\\s+\\d{1,2},\\s+\\d{4}\\s+from\\s+\\d{1,2}:\\d{1,2}\\s+AM\\s+to\\s+\\d{1,2}:\\d{1,2}\\s+PM)",
        Pattern.CANON_EQ | Pattern.DOTALL);
于 2013-04-03T16:19:27.107 回答