Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-字符串上的正则表达式来确定日期_Java_Regex_Date - Fatal编程技术网

Java-字符串上的正则表达式来确定日期

Java-字符串上的正则表达式来确定日期,java,regex,date,Java,Regex,Date,我有点被最有效的方法难住了 我有一大串文本,其中的某个地方是字符串“2013年4月3日星期三上午9:00到下午6:00” 我知道文本将始终采用这种格式,但我需要一种从字符串中提取此信息的方法。我认为正则表达式是最好的选择,但我不知道这个字符串前后会是什么,我无法匹配字符数,因为月份和天数的长度不同。此外,字符串可以是任意长度 我想我的问题是,这个字符串上是否有一个正则表达式可以用来提取日期和时间,如果字符串可以是1到10000多个字符,那么这是否是解决这个问题的有效方法?也许您可以这样做: (S

我有点被最有效的方法难住了

我有一大串文本,其中的某个地方是字符串
“2013年4月3日星期三上午9:00到下午6:00”

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


我想我的问题是,这个字符串上是否有一个正则表达式可以用来提取日期和时间,如果字符串可以是1到10000多个字符,那么这是否是解决这个问题的有效方法?

也许您可以这样做:

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

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

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

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);

不是最短的正则表达式,但它对您有效示例:

((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)

这可能是用正则表达式实现的方法,但速度会很慢。我同意。这就是我的意思,这似乎是唯一的方法,但速度会很慢。SimpleDateFormat对于这个特定场景非常有用。但在代码的其他部分,它将匹配其他子字符串的字符串,而不是日期,通过前端提供正则表达式。我认为经典是最好的选择。@sp00m-如何帮助找到文本中使用它的位置?
SimpleDateFormat
我相信这个问题会吸引反对票,因为正是这些类型的表达式(而您的问题没有显示任何先前的研究)。此外,问什么是最有效的方法是不可能回答的,因为效率主要取决于您的环境和确切的逻辑。同样,网上也有关于regex效率的详细信息。非常感谢,类似于Ted的解决方案。。这真的是最有效的方法吗?我正在尽我最大的努力把这根绳子的尺寸缩小,去掉不用的部分,使它更快,但它仍然会很慢。我不是在敲你的答案,我只是想知道有没有更快的办法。