1

我有以下正则表达式,它可以让我获得创建索引语句的表名和列详细信息:

        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 [card] (cardSetId ASC)

4

2 回答 2

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\\[\\]]*,?)*)\\)
于 2012-06-14T18:58:43.060 回答
0

你的问题对于你真正想要抓住的东西有点模糊,而且那个正则表达式非常粗糙,所以我无法从中收集到它。

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

这将获取第 1 组中的表名、第 2 组中的 ON 属性以及第 3 组中的以下属性。

于 2012-06-14T17:46:34.923 回答