Почему этот шаблон регулярных выражений не соответствует этому тексту? (Простое регулярное выражение включает только экранированный текст с символом подстановки в середине)

Извиняюсь, если это дубликат; Я обещаю, что я действительно искал.

Я работаю над проектом тестирования интеграции C#, используя NUnit в Visual Studio 2010 Professional, и запускаю тесты с помощью Resharper v6.1. (Resharper 6.1 требует, чтобы я использовал NUnit 2.5.10; у меня всегда были проблемы с попыткой переопределить это.)

Часть моего тестирования состоит в том, чтобы утверждать, что выбрасываются правильные исключения, включая сообщения об исключениях. Тем не менее, иногда сообщение об исключении содержит подсказку или другую информацию, которая, как я полагаю, не всегда будет одинаковой. Чтобы обойти это, я хочу сопоставить сообщение об исключении, используя базовый шаблон регулярных выражений, где я включаю сообщение об исключении и просто использую подстановочный знак, где в определенных местах можно сказать "эта часть может совпадать с чем угодно", я пытался сделать это в сценарий ниже, но каждый раз, когда я получаю ошибку, что нет совпадения. Краткое содержание кода:

[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);

Заранее спасибо за помощь! Кроме того, извиняюсь, если я пропускаю что-то действительно глупое. Я редко работал с регулярными выражениями, так что это, безусловно, возможно.

2 ответа

Решение

Regex.Escape(@"\r\n") будет производить \\r\\nчто не то, что вы хотите. Вместо этого я бы предложил переместить новую строку в неэкранированную строку:

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

Зачем использовать сложное регулярное выражение, когда вы можете просто использовать string.StartsWith а также string.EndsWith проверить префикс и суффикс? Меньше кода, легче читать, и не нужно пытаться понять, почему, казалось бы, простая вещь не работает правильно.

Другие вопросы по тегам