繁体   English   中英

为什么此正则表达式模式与此文本不匹配? (简单的正则表达式只在中间包含通配符的转义文本)

[英]Why doesn't this regex pattern match this text? (Simple regex just includes escaped text with wildcard in the middle)

抱歉,如果这是重复的; 我保证我做了搜索。

我正在使用Visual Studio 2010 Professional中的NUnit进行C#集成测试项目,并使用Resharper v6.1运行测试。 (Resharper 6.1指示我使用NUnit 2.5.10;尝试覆盖它总是很困难。)

我测试的一部分是断言是否抛出了适当的异常,包括异常消息。 但是,有时异常消息会包含Guid或其他信息,但我不希望它们每次都完全相同。 为了解决这个问题,我想使用一种基本的正则表达式模式来匹配异常消息,在该模式中我包括了异常消息,并且只使用了通配符,其中在某些地方说“这部分可以匹配任何内容”,我尝试在下面的情况,但是每次出现错误时,都没有匹配项。 代码摘要:

[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(@"\r\nThe 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).\r\nThe 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.Escape(@"\\r\\n")将产生\\\\r\\\\n ,这不是您想要的。 我建议将换行符移至未转义的字符串:

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

为什么只使用string.StartsWithstring.EndsWith来检查前缀和后缀,为什么要使用复杂的正则表达式? 更少的代码,更易于阅读,并且毫不费力地试图弄清为什么看似简单的事情行不通。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM