Почему этот шаблон регулярных выражений не соответствует этому тексту? (Простое регулярное выражение включает только экранированный текст с символом подстановки в середине)
Извиняюсь, если это дубликат; Я обещаю, что я действительно искал.
Я работаю над проектом тестирования интеграции 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
проверить префикс и суффикс? Меньше кода, легче читать, и не нужно пытаться понять, почему, казалось бы, простая вещь не работает правильно.