閱讀: 233 評論: 1 作者: 戲水 發表于 2009-12-10 15:46 原文鏈接

由于想在公司開一個關于正則表達式的小講座,所以在群里征集大家的實際工作中的問題。有位同學很可愛,報告了一個需求, 如下:

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一下。 本例在倉促下寫就,可能有疏漏,記之備查。同學們誰有更好的寫法 不妨交流一下。

  發表評論


新聞頻道:開心網用戶群出現逃離者:商業模式面臨各種挑戰

推薦鏈接:Windows 7專題發布

網站導航:博客園首頁  個人主頁  新聞  社區  博問  閃存  知識庫


文章來源:http://www.cnblogs.com/zjneter/archive/2009/12/10/1621153.html