从内部异常消息中提取文本

时间:2016-07-13 04:02:50

标签: c# regex exception

我有这个数据库异常消息

  

DELETE语句与REFERENCE约束冲突" FK_dbo.MyApprovals_dbo.My_ApproverMyId"。冲突发生在数据库" DatabaseDev",table" dbo.DatabaseTable",column' ApproverPositionId'。
  声明已经终止。

我需要提取两个组件

DELETE 
DatabaseTable

我正在尝试使用以下正则表达式

var result = Regex.Match("The DELETE statement conflicted with the REFERENCE constraint \"FK_dbo.MyApprovals_dbo.My_ApproverMyId\". The conflict occurred in database \"DatabaseDev\", table \"dbo.DatabaseTable\", column 'ApproverPositionId'.\r\nThe statement has been terminated.").Groups[1].Value;

2 个答案:

答案 0 :(得分:0)

对于您的具体问题,您想要的正则表达式为(DELETE).+database "(.+?)",两个捕获组将包含您想要的内容。

更通用的版本(更好地记录错误)如下:

The (.+?) statement.+the(.+?)\". The conflict.+(database ".+?", table ".+?", column '.+?')

捕获组将按顺序吐出(按顺序)语句(DELETE,SELECT等),命中的约束以及DB,表和列。当然,这仅适用于具有此特定结构的错误消息。

整体代码看起来像这样:

Match m = Regex.match(errorString, @"The (.+?) statement.+the(.+?)""\. The conflict.+(database "".+?"", table "".+?"", column '.+?')");
Console.WriteLine(m.Groups[1].value);

应该注意的是,我不是C#家伙(我正在回答正则表达式问题),所以这可能有问题。

答案 1 :(得分:0)

请注意,Regex.Match()至少需要2个参数,一个字符串和一个正则表达式模式(您错过了正则表达式模式部分)。

此外,当您运行正则表达式匹配时,您应首先检查是否与Match.Success匹配。否则,你可能会遇到例外情况。

您可以使用一个简单的正则表达式,将所需的值捕获到组中:

var str = "The DELETE statement conflicted with the REFERENCE constraint \"FK_dbo.MyApprovals_dbo.My_ApproverMyId\". The conflict occurred in database \"DatabaseDev\", table \"dbo.DatabaseTable\", column 'ApproverPositionId'.\r\nThe statement has been terminated.";
var m = Regex.Match(str, @"(?s)(?<delete>[A-Z]+)\s+statement.*?,\s+table\s+""\w+\.(?<table>[^""]+)");
if (m.Success) {
    Console.WriteLine(m.Groups["delete"].Value); // => DELETE
    Console.WriteLine(m.Groups["table"].Value);  // => DatabaseTable
}

请参阅this IDEONE demo

正则表达式匹配:

  • (?s) - 使.匹配包含换行符的任何字符的单行修饰符(以防万一你可能在两个组之间的字符串中有换行符)
  • (?<delete>[A-Z]+)\s+statement - 1 + ASCII大写字母([A-Z]+)被捕获到组“删除”,1 +空格(\s+)后跟statement子串
  • .*?, - 任意0个字符,直到第一个,
  • \s+ - 一个或多个空格
  • table\s+ - table子字符串后跟1 +空格
  • ""\w+\. - ",1 +个字符和文字.
  • (?<table>[^""]+) - 组合“表格”匹配除"以外的1个以上字符。