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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值