挑战:只用一条正则表达式来完成工作
由于想在公司开一个关于正则表达式的小讲座,所以在群里征集大家的实际工作中的问题。有位同学很可爱,报告了一个需求, 如下:
CREATE TABLE cdb_adminactions (
admingid smallint(6) unsigned NOT NULL DEFAULT '0',
disabledactions text NOT NULL,
PRIMARY KEY (admingid)
) TYPE=MyISAM;
如果 CREATE TABLE 语句中包含 类型为 text 的字段 ,那么需要生成对应的 ALTER TABLE 语句如下 (只用一条正则表达式,也就是说只用一次替换,不要分步进行或者使用循环)
ALTER TABLE cdb_adminactions change disabledactions disabledactions text NOT NULL;
好吧,我们来看看怎么用正则表达式来匹配并替换生成这些 ALTER TABLE 语句。经过一番测试,最终
匹配文本的表达式确定为 :
CREATE TABLE(?<=^CREATE TABLE) (\w+) \(.* (\w+) (?=text NOT NULL)text NOT NULL.*\) type=myisam;
替换表达式确定为:
ALTER TABLE $1 change $2 $2 text NOT NULL;
效果如下:
对应的c#代码如下:
string resultString = null;
string subjectString= null; //把subjectString 赋值为从 .sql 文件中读入的文本。
try {
resultString = Regex.Replace(subjectString, @"CREATE TABLE(?<=^CREATE TABLE) (\w+) \(.* (\w+) (?=text NOT NULL)text NOT NULL.*\) type=myisam;", "ALTER TABLE $1 change $2 $2 text NOT NULL;", RegexOptions.Singleline | RegexOptions.IgnoreCase | RegexOptions.Multiline);
} catch (ArgumentException ex) {
// Syntax error in the regular expression
}
备注:这里用到了正则表达式中成为 环视(也叫 预查 或 零宽断言),算是正则表达式中比较高级的东东,有兴趣的可以Google一下。 本例在仓促下写就,可能有疏漏,记之备查。同学们谁有更好的写法 不妨交流一下。