2

2 つの質問があります。

まず、次の文字列を、文字列内のメソッドによって分割された個々の文字列に分割するにはどうすればよいですか? 正規表現を使用しようとしましたが、失敗しました。

$objc = "- (void)method {
    NSLog(@"method");

    if (1 == 1) {
        //blah blah blah
    }
}

- (id)otherMethodWithProperty:(NSString *)property {        
    NSLog(@"otherMethodWithProperty:");

    return property;
}

-(id) methodWithMoreProperties: (id)property Property2:(UIView *)property2  Property3:(NSString *)property3 {
    id view = property;

    if (view) {
         NSLog(@"%@", view);
    }

    return view;
}"

2 番目の質問は、個々の文字列に分割した後、各プロパティを取得してそれぞれの文字列内に追加することは可能ですか? 例えば:

私は文字列を取ります:

"-(id) methodWithMoreProperties: (id)property Property2:(UIView *)property2  Property3:(NSString *)property3 {
    id view = property;

    if (view) {
         NSLog(@"%@", view);
    }

    return view;
}"

プロパティ「property、property2、property3」を取得し、文字列内の最初の「{」の後、最後の「}」の前に追加します。

"-(id) methodWithMoreProperties: (id)property Property2:(UIView *)property2  Property3:(NSString *)property3 {
    NSLog(@"%@\n%@\n%@", property, property2, property3);
    id view = property;

    if (view) {
         NSLog(@"%@", view);
    }

    return view;
    NSLog(@"FINISH: %@\n%@\n%@", property, property2, property3);
}"

私は何時間もコードをグーグルでテストしてきましたが、正規表現を使用してメソッド名を取得することしかできませんでした

-(id) methodWithMoreProperties:

文字列内に追加しますが、プロパティ自体を取得して最初の { の後と最後の } の前に追加することはできませんでした

4

2 に答える 2

3

すべてが正規表現で行われたわけではありませんが、より読みやすいと思います

# split string into methods
my @methods = split /^-/m, $objc;

foreach my $method_content (@methods) {
    my $method_declaration = (split /{/, $method_content, 2)[0];

    my ($method_name, @properties) = $method_declaration =~ /\)\s*(\w+)/g;

    if (@properties) {
        my $sprintf_format = join '\n', ('%@') x @properties;
        my $sprintf_values = join ', ', @properties;
        my $begin_message = sprintf 'NSLog(@"%s", %s);',         $sprintf_format, $sprintf_values;
        my $end_message   = sprintf 'NSLog(@"FINISH: %s", %s);', $sprintf_format, $sprintf_values;

        $method_content =~ s/{/{\n    $begin_message/;
        $method_content =~ s/}\s*$/    $end_message\n}\n\n/;
    }

    print "-$method_content";
}

ただし、$end_messageメソッドの前に配置する方が適切returnです。そうしないと、トリガーされません。

于 2013-08-11T07:31:23.300 に答える
1

次のパターンを使用できます。

my @matches = $objc =~ /(-\s*+\([^)]++\)(?>\s*+\w++(?>:\s*+\([^)]++\)\s*+\w++)?+)*+\s*+({(?>[^{}]++|(?-1))*+}))/g;

(必要に応じてキャプチャグループをコスチューム化するだけです)

于 2013-08-11T02:13:49.107 に答える