1

次の正規表現を使用して、createindexステートメントのテーブル名と列の詳細を取得します。

        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])];

これは部分的に機能します。それは私に3つの範囲を与えます。最初の文字列には文字列全体が含まれ、2番目の文字列にはテーブル名が含まれます。問題は、3番目のものが空であるということです。

誰かが私が間違っているところについて何か考えがありますか?

編集:私が解析しようとしている文字列は次のとおりです:CREATE INDEX cardSetIndex ON [card](cardSetId ASC)

4

2 に答える 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 に答える