2012-06-14 52 views
1

我有以下的正則表達式,得到我create index語句的表名和列細節:C#正則表達式NSRegularExpression

 Regex r = new Regex(@"create\s*index.*?\son\s*\[?(?<table>[\s\w]*\w)\]?\s*\((?:(?<cname>[\s\d\w\[\]]*),?)*\)", RegexOptions.Compiled | RegexOptions.IgnoreCase); 

我想在Objective-C中使用此。我試過以下內容:

  NSError * error = nil; 
      NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: @"create\\s*index.*?\\son\\s*\\[?([\\s\\w]*\\w)\\]?\\s*\\((?:([\\s\\d\\w\\[\\]]*),?)*\\)" 
                        options: NSRegularExpressionCaseInsensitive | NSRegularExpressionSearch 
                        error: &error]; 
      if(nil != error) 
      { 
       NSLog(@"Error is: %@. %@", [error localizedDescription], error); 
      } 

      NSRange rangeOfFirstMatch = [regex rangeOfFirstMatchInString: createStatement options:0 range: NSMakeRange(0, [createStatement length])]; 

      NSArray *matches = [regex matchesInString: createStatement 
               options: 0 
               range: NSMakeRange(0, [createStatement length])]; 

部分工作。它給了我三個範圍。第一個包含整個字符串,第二個包含表名。問題是第三個是空的。

任何人有任何想法,我哪裏會出錯?

編輯:我試圖解析字符串是:CREATE INDEX cardSetIndex ON [卡](cardSetId ASC)

回答

2

你似乎有問題是第二捕獲組將被(?:)*的最後一次迭代覆蓋。由於其可選,其始終空白。

你的正則表達式:

create\s*index.*?\son\s* 
\[? 
    ([\s\w]*\w) 
\]?\s* 
\(
    (?: 
     ([\s\d\w\[\]]*) 
     ,? 
    )* 
\) 

將其更改爲:

create\s*index.*?\son\s* 
\[? 
    ([\s\w]*\w) 
\]? 
\s* 
\(
    (
     (?: [\s\d\w\[\]]* ,?)* 
    ) 
\) 

壓縮和轉義:

create\\s*index.*?\\son\\s*\\[?([\\s\\w]*\\w)\\]?\\s*\\(((?:[\\s\\d\\w\\[\\]]*,?)*)\\) 
0

你的問題是有點不清楚你真正想要抓住什麼,而正則表達式是相當粗糙,所以我無法從中收集。

CREATE\s*INDEX\s*(\w+)\s*ON\s*(\[\w+\])\s*\((.+)\)

這將在第1組搶表名,物業組2,下列財產後,在第3組

相關問題