将时间字符串与正则表达式匹配

时间:2008-10-16 15:58:54

标签: regex time pcre

我想将字符串中的时间(10.00)与日期和时间(“21.01.08 10.00”)进行匹配。我正在使用以下正则表达式:

new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}\\b" "g");

但这与21.01.08和10.00匹配21.01。

我正在使用PCRE作为我的regualar表达引擎。

更新

对不起,我应该更清楚了。数据和时间是更大字符串的一部分。我想从该字符串中提取时间。

例如:

“从2010年10月21日开始,派对将在图书馆举行” “21.08.08 - 10:00将举行派对” “在2008年8月21日,你将被安排...... ......将从10.00开始”

这可能吗?

3 个答案:

答案 0 :(得分:4)

您的原始正则表达式无效,因为\b(字边界)与“。”匹配。在“21.01.08。”您需要更加健壮地编码边界:

(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d])

使用您使用的任何一种符号捕获时间,同时排除日期。请注意,它不会验证时间。例如,它将匹配“88:99”验证时间是可能的,但显着地使模式复杂化,并且在大多数情况下可能过度。

使用后视而不是非捕获分组会很好,但PCRE不支持可变宽度的后视。

答案 1 :(得分:1)

^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$

应该将时间部分放入捕获组中。

“新的RegExp”我不确定(Java也许?)。在Perl中你可以得到像......这样的值。

if ("21.01.08 10.00" =~ m/^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$/g) {
  $time_part = $1;
}

在.NET中,以下内容应该有效......

  Regex r = new Regex(@"^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$");
  string dateTimeString = "21.01.08 10.00";
  if (r.IsMatch(dateTimeString)) {
    string timePart = r.Match(dateTimeString).Groups[1].Value;
    Console.Write(timePart);
  }
  Console.ReadKey();

如果你想使用比索引更不明确的东西,你也可以使用Named Capture

答案 2 :(得分:0)

尝试使用

new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}$" "g");

$表示字符串结尾