你可以写一个迷你分析器。在字符串中移动以跟踪引用状态。一般来说可能更可靠。
另一种选择是使用一个正则表达式,而整个内容,它可以在一个regex.Split被捕获,而不是跳过输出相匹配:
var re = new Regex(@"([\w\s]+=\s*?(?:['""][\w\s]+['""]|[\w\s]+));");
var parts = re.Split(connectionString)
这假定:
否引用引号(或其他方式)引号的能力
名称上的内容仅限于空格和字母数字(用覆盖有效字符的组替换[\ s \ w])。
就个人而言,如果我不能很快锻炼正则表达式,我会去解析器。
编辑:有一个更简单的方法。 DbConnectionStringBuilder实现IEnumerable,所以把它做的工作:
using System;
using System.Collections.Generic;
using System.Data.Common;
class Program {
static void Main(string[] args) {
string conStr = @"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=vm-jp-dev2;Data Source='scsql\sql;2005';Auto Translate=False";
var cb = new DbConnectionStringBuilder();
cb.ConnectionString = conStr;
int n = 0;
foreach (KeyValuePair c in cb) {
Console.WriteLine("#{0}: {1}={2}", ++n, c.Key, c.Value);
}
}
}