我有这个数据库异常消息
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;
答案 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
}
正则表达式匹配:
(?s)
- 使.
匹配包含换行符的任何字符的单行修饰符(以防万一你可能在两个组之间的字符串中有换行符)(?<delete>[A-Z]+)\s+statement
- 1 + ASCII大写字母([A-Z]+
)被捕获到组“删除”,1 +空格(\s+
)后跟statement
子串.*?,
- 任意0个字符,直到第一个,
\s+
- 一个或多个空格table\s+
- table
子字符串后跟1 +空格""\w+\.
- "
,1 +个字符和文字.
(?<table>[^""]+)
- 组合“表格”匹配除"
以外的1个以上字符。