4

我想将字符串中的时间(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 作为我的常规表达式引擎。

更新:

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

例如:

“21.01.08 从 10.00 开始,图书馆将举行派对” “21.08.08 - 10:00 将举行派对” “21.08.08 你被安排参加.................. 10:00 开始"

这可能吗?

4

3 回答 3

4

您的原始正则表达式不起作用,因为\b(单词边界)匹配“。” 在“21.01.08”中。您需要更健壮地对边界进行编码:

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

这会以您使用的任何一种表示法捕获时间,但不包括日期。请注意,它不会验证时间。例如,它将匹配“88:99” 验证时间是可能的,但会使模式显着复杂化,并且在大多数情况下可能会过度杀伤力。

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

于 2008-10-16T17:03:16.043 回答
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();

如果您想使用比捕获组中的索引更不模糊的东西,也可以使用命名捕获。

于 2008-10-16T16:07:49.307 回答
0

尝试使用

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

$ 表示字符串结束

于 2008-10-16T16:05:20.280 回答