2012-06-14 51 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组

相关问题