我需要从给定的文本中找到检索时间,例如今晚加入我们共进晚餐,直到晚上10点#LeBunSocial @ 3compasses#e8 #Dalston
对于上述条件,下面代码完全正常
if (Regex.IsMatch(str, @"(?'hour'\d{2})(?'ampm'AM|am|PM|pm|Pm)", RegexOptions.Compiled)) //2 digits + pm/AM" (without space)
{
m = Regex.Match(str, @"(?'hour'\d{2})(?'ampm'AM|am|PM|pm|Pm)", RegexOptions.Compiled);
result = true;
counter++;
}
但由于某些商业原因,我必须在代码下面执行。正则表达式不应该与10PM匹配,因为下面提到了1位数限制,但它仍然与下面的正则表达式匹配。怎么避免呢?以下代码仅适用于(例如1PM)1位
if (Regex.IsMatch(str, @"(?'hour'\d{1})(?'ampm'AM|am|PM|pm|Pm)", RegexOptions.Compiled)) // 1 digit + AM/PM without space
{
m = Regex.Match(str, @"(?'hour'\d{1})(?'ampm'AM|am|PM|pm|Pm)", RegexOptions.Compiled);
result = true;
counter++;
}
答案 0 :(得分:1)
\d
({1}
是无操作,因为除非另有说明,否则每个正则表达式标记只匹配一次)与0
中的10
匹配。如果您希望它只匹配一位数,可以使用negative lookbehind assertion:
@"(?<!\d)(?'hour'\d)(?'ampm'AM|am|PM|pm|Pm)"
但整个方法很奇怪。例如,为什么不简单地使正则表达式不区分大小写(或者您是否特别想要允许Pm
并禁止Am
)?
此外,为什么两次匹配同一个正则表达式?
答案 1 :(得分:0)
只需在\b
之前使用单词边界\d
,以确保在该单个数字之前必须存在单词边界。 \b
匹配单词字符和非单词字符。
@"(?'hour'\b\d)(?'ampm'(?i)[ap]m)"
(?i)[ap]m
会对am
或pm