C#字符串匹配基于通配符

时间:2014-08-18 10:03:55

标签: c# .net regex

我收到了一些像

这样的数据库异常

Database 'db_name' cannot be opened. It is in the middle of a restore

try
{
}
catch(Exception ex)
{
  if(ex.Message.Contains("Database 'db_name' cannot be opened. It is in the middle of a restore")){
   //show user friendly message
  }
}

但问题是我们有大约10-15个数据库名称,我们将继续添加更多。

如何匹配带通配符的字符串?

是否有任何正则表达式匹配Database '{whatevercomes}' cannot be opened. It is in the middle of a restore

之类的内容

4 个答案:

答案 0 :(得分:3)

您应该只处理SqlException而不是所有例外。然后通过Number property区分错误。您的错误 927

在这里您可以找到所有:http://technet.microsoft.com/en-us/library/aa937592(v=sql.80).aspx

try
{
    // ...
}
catch(SqlException ex)
{
    if(ex.Number == 927)
    {
        //show user friendly message
    }
}

根据数据库的实际名称:似乎无法从SqlException检索它。由于本地化消息也可能会发生变化,为什么您无法在打开连接的情况下处理此异常?然后你可以简单地使用SqlConnection.DataBase-property

例如:

using (var con = new SqlConnection("Connection-String"))
{
    try
    {
        con.Open();
        // ...
    } catch (SqlException ex)
    {
        string database = con.Database;
        if (ex.Number == 927)
        {
            //show user friendly message
            string errorMessage = string.Format("Could not open database '{0}' since it's currently restoring. Please inform your database administrator."
                                               , database);
            MessageBox.Show( errorMessage );
        }
    }
}

答案 1 :(得分:1)

而不是正则表达式只需使用此

 if(ex.Message.IndexOf("Database ") == 0 && ex.Message.Contains(" cannot be opened. It is in the middle of a restore") == true)
 {
      //user friendly message here
 }

答案 2 :(得分:1)

试试这个正则表达式:Database '(.*?)' cannot be opened\. It is in the middle of a restore

用法:

var regex = @"Database '(.*?)' cannot be opened\. It is in the middle of a restore";
var match = Regex.Match(msg, regex);
if (match .Success)
{
    var databaseName = match.Groups[1].Value; 
    // Show messgage
}

但是你不应该解析异常文本,而只能查看异常类型和另一个问题中提到的Number属性。 (原因:如果您的应用程序在使用其他语言的操作系统上执行该怎么办?)

答案 3 :(得分:0)

不确定它会对您有所帮助。如果你使用两个单独的条件来实现那个

,那么不要尝试正则表达式
try
{
}
catch(Exception ex)
{
  if(ex.Message.StartsWith("Database") && ex.Message.Contains(" cannot be opened. It is in the middle of a restore")){
   //show user friendly message
  }
}