【发布时间】:2018-08-24 17:55:21
【问题描述】:
下午好!我试图编写一个仅当字符串包含给定格式的日期或两个匹配短语之一时才匹配的模式:
(?=(?<p0>(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[ ](\d+)(,)[ ](\d+)[ ](\d+):(\d+):(\d+) (PM|AM)))?(?=(?<p1>MATCHINGPHRASE2))?(?=(?<p2>MATCHINGPHRASE3))?
我有一个方法调用使用这种模式的正则表达式,如下所示:
internal bool IsSubjectRecognized(string subject)
{
var match = _regEx.Match(subject);
if (match.Success)
{
return true;
}
return false;
}
最后,我有一个单元测试,以确保上述方法对于不包含日期的字符串返回 false,或者匹配如下所示的短语:
public void IsSubjectRecognizedRejectsReggoStrings()
{
var subject = "Watch out for the medalions. My diamonds are wreckless.";
var rules = new MatchingRules();
Assert.IsFalse(rules.IsSubjectRecognized(subject));
}
为什么返回 true?!
【问题讨论】:
-
假设
{和}实际上不是模式的一部分,正则表达式模式中的所有内容都是可选的(后跟?),因此模式匹配每个字符串。 -
如果您在破译/理解您的正则表达式时遇到困难,您可以借助 debuggex.com 之类的服务将其逻辑可视化(确保选择 PCRE 作为正则表达式风格)
-
@elgonzo 整洁!谢谢大佬!
-
模式中的所有主要组都使用
?进行量化,因此它将匹配字符串开头、字符串结尾以及每个字符之间的零长度位置。