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


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

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

  • 相关阅读:
    UniGUI 之UniDBGrid(05)
    Spring事务管理
    MySQL数据库隔离级别
    MySQL并发控制
    MySQL存储引擎
    数据库事务(2)---ACID与并发问题
    数据库事务(1)----- JDBC事务与JTA事务
    navicat Window . MAC版常用快捷键
    重要博客
    yunw
  • 原文地址:https://www.cnblogs.com/zjneter/p/1621153.html
Copyright © 2020-2023  润新知