题
我想将字符串中的时间(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年1月21日开始,将在图书馆举行派对” “21.08.08 - 10:00将举行派对” “在21.08.08你准备好......。 ......将从10.00开始
这可能吗?
解决方案
您的原始正则表达式无法正常工作,因为 \ b
(字边界)与“。”匹配。在“21.01.08。”中。您需要更加健壮地编码边界:
(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d])
使用您使用的任何一种符号捕获时间,同时排除日期。请注意,它不会验证时间。例如,它将匹配“88:99”。验证时间是可能的,但显着地使模式复杂化,并且在大多数情况下可能过度。
使用后视而不是非捕获分组会很好,但PCRE不支持可变宽度的后视。
其他提示
^\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})<*>quot;);
string dateTimeString = "21.01.08 10.00";
if (r.IsMatch(dateTimeString)) {
string timePart = r.Match(dateTimeString).Groups[1].Value;
Console.Write(timePart);
}
Console.ReadKey();
如果你想使用不那么模棱两可的东西,你也可以使用命名捕获然后将索引导入捕获组。
尝试使用
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}<*>quot; "g");
$表示字符串结尾
不隶属于 StackOverflow