为什么这个正则表达式模式与这个文本不匹配?(简单的正则表达式只包括中间带有通配符的转义文本)



如果这是重复的,请道歉;我保证我确实搜查过。

我正在Visual Studio 2010 Professional中使用NUnit进行C#集成测试项目,使用Resharper v6.1运行测试。(Resharper 6.1规定我使用NUnit 2.5.10;我一直很难覆盖它。)

我测试的一部分是断言抛出了正确的异常,包括异常消息。但是,有时异常消息包含一个guid或其他信息,我不希望每次都完全相同。为了解决这个问题,我想使用一个基本的regex模式来匹配异常消息,在这个模式中我包括异常消息,并简单地使用通配符,在某些地方说"这部分可以匹配任何东西",我在下面的场景中尝试过这样做,但每次我收到一个没有匹配的错误。代码摘要:

[Test]
public void ExceptionPatternTest()
{
var patternA = Regex.Escape(@"SQL Code: 2601 Message: Cannot insert duplicate key row in object 'dbo.ResourceCategory' with unique index 'IDX_ResourceTypeResourceCategoryName'.");
var patternB = ".*";  //wildcard
var patternC = Regex.Escape(@"rnThe statement has been terminated.");    
var pattern = patternA + patternB + patternC;
var thrownException = Assert.Throws(Is.TypeOf(_testException.GetType()),
() => Throw()); //Call method and assert that exception is thrown.
Assert.That(Regex.IsMatch(thrownException.Message, pattern));
}
private void Throw()
{
throw _testException;
}
readonly Exception _testException = new Exception("SQL Code: 2601 Message: Cannot insert duplicate key row in object 'dbo.ResourceCategory' with unique index 'IDX_ResourceTypeResourceCategoryName'. The duplicate key value is (9fec90c1-12b4-42c3-adc0-a0d600b9a8e8, 1, Item Cat 1).rnThe statement has been terminated.");

我也尝试过对其中的部分进行变体。包括模式的手动字符转义:

var pattern = @"SQL Code: 2601 Message: Cannot insert duplicate key row in object 'dbo.ResourceCategory' with unique index 'IDX_ResourceTypeResourceCategoryName'..*\r\nThe statement has been terminated.";

我也尝试过StringAssert,以防出现差异:

StringAssert.IsMatch(pattern, thrownException.Message);

提前感谢您的帮助!此外,如果我只是错过了一些非常愚蠢的东西,请道歉。我只是少量地使用regex,所以这当然是可能的。

Regex.Escape(@"rn")将生成\r\n,这不是您想要的。我建议将换行移到未跳过的字符串:

var patternB = @".*rn";
var patternC = Regex.Escape(@"The statement has been terminated.");    

既然可以只使用string.StartsWithstring.EndsWith来检查前缀和后缀,为什么要使用复杂的正则表达式?更少的代码,更容易阅读,并且不必费力地试图找出为什么一件看似简单的事情不能正常工作。

最新更新