挑战:只用一条正则表达式来完成工作

由于想在公司开一个关于正则表达式的小讲座,所以在群里征集大家的实际工作中的问题。有位同学很可爱,报告了一个需求, 如下:

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;

效果如下:

image

对应的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一下。 本例在仓促下写就,可能有疏漏,记之备查。同学们谁有更好的写法 不妨交流一下。

posted @ 2009-12-10 15:46  戏水  阅读(905)  评论(1编辑  收藏  举报