zoukankan      html  css  js  c++  java
  • 挑战:只用一条正则表达式来完成工作

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

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

  • 相关阅读:
    SOHO路由器
    SYN Flood
    Java线程池
    BIO
    Java虚拟机的基本结构
    Linux 的Ext2
    java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
    cassandra-CQL
    数列分段`Section II`(二分
    Exams(二分
  • 原文地址:https://www.cnblogs.com/zjneter/p/1621153.html
Copyright © 2011-2022 走看看