nsstring заменить строку в диапазоне - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть строка с определенным рисунком.Мне нужно найти шаблон и заменить строку внутри этого шаблона.Например:

NSString *string = @"{Hello} ({World}) ({How}) ({Are}) ({You})";
NSString *result = nil;

// Determine "{" location
NSRange startRange = [string rangeOfString:@"{" options:NSCaseInsensitiveSearch];
if (startRange.location != NSNotFound)
{
    // Determine "}" location according to "{" location
    NSRange endRange;

    endRange.location = startRange.length + startRange.location;
    endRange.length   = [string length] - endRange.location;
    endRange = [string rangeOfString:@"}" options:NSCaseInsensitiveSearch range:endRange];

    if (endRange.location != NSNotFound)
    {
        // bracets found: retrieve string between them
        startRange.location += startRange.length;
        startRange.length = endRange.location - startRange.location;

        result = [string substringWithRange:startRange];

    }
}

Здесь я могу извлечь первую подстроку, которая находится между "{}", т.е. - "Hello", но мне также нужно продолжить проверку и хочу извлечь другие строки.*

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011

Попробуйте это:

NSString *string = @"{Hello} ({World}) ({How}) ({Are}) ({You})";
    //NSString *result = nil;

    // Determine "{" location

    NSArray *array=[string componentsSeparatedByString:@"{"];
    for(NSString *str in array){
        NSString *newString=[[str componentsSeparatedByString:@"}"] objectAtIndex:0];
    NSLog(@"%@",newString);
    }
0 голосов
/ 12 декабря 2011

У меня случайно появился этот код.Я думаю, что это именно то, что вы хотите.Я реализовал это как категорию на NSString.Вы используете это так:

NSString *template = @"{Hello} ({World}) ({How}) etc etc";
NSDictionary *vars = [NSDictionary dictionaryWithObjectsAndKeys:
    @"Bonjour", @"Hello",
    @"Planet Earth", @"World",
    @"Como", @"How",
    // etc.
    nil];

NSString *expandedString = [template stringByExpandingTemplateWithVariables:vars];
// expandedString is @"Bonjour (Planet Earth) (Como) etc etc"

Вот код.

Файл NSString+TemplateExpansion.h

#import <Foundation/Foundation.h>

@interface NSString (TemplateExpansion)

- (NSString *)stringByExpandingTemplateWithVariables:(NSDictionary *)dictionary;

@end

Файл NSString+TemplateExpansion.m

#import "NSString+TemplateExpansion.h"

@implementation NSString (TemplateExpansion)

- (NSString *)stringByExpandingTemplateWithVariables:(NSDictionary *)dictionary
{
    NSUInteger myLength = self.length;
    NSMutableString *result = [NSMutableString stringWithCapacity:myLength];

    NSRange remainingRange = NSMakeRange(0, myLength);
    while (remainingRange.length > 0) {
        NSRange leftBraceRange = [self rangeOfString:@"{" options:0 range:remainingRange];
        if (leftBraceRange.location == NSNotFound)
            break;

        NSRange afterLeftBraceRange = NSMakeRange(NSMaxRange(leftBraceRange), myLength - NSMaxRange(leftBraceRange));
        NSRange rightBraceRange = [self rangeOfString:@"}" options:0 range:afterLeftBraceRange];
        if (rightBraceRange.location == NSNotFound)
            break;

        NSRange beforeLeftBraceRange = NSMakeRange(remainingRange.location, leftBraceRange.location - remainingRange.location);
        [result appendString:[self substringWithRange:beforeLeftBraceRange]];
        remainingRange = NSMakeRange(NSMaxRange(rightBraceRange), myLength - NSMaxRange(rightBraceRange));

        NSRange keyRange = NSMakeRange(NSMaxRange(leftBraceRange), rightBraceRange.location - NSMaxRange(leftBraceRange));
        NSString *key = [self substringWithRange:keyRange];
        NSString *value = [dictionary objectForKey:key];
        if (value)
            [result appendString:value];
    }

    [result appendString:[self substringWithRange:remainingRange]];
    return result;
}

@end
0 голосов
/ 12 декабря 2011

попробуйте это:

NSString *string = @"{Hello} ({World}) ({How}) ({Are}) ({You})";
    NSMutableString *result = [[NSMutableString alloc] init];

    NSArray *tempArray = [[string componentsSeparatedByString:@" "] mutableCopy];

    for (int i=0; i < [tempArray count]; i++)
    {
        NSString *tempStr = [tempArray objectAtIndex:i];
        NSRange startRange = [tempStr rangeOfString:@"{" options:NSCaseInsensitiveSearch];
        if (startRange.location != NSNotFound)
        {
            // Determine "}" location according to "{" location
            NSRange endRange;

            endRange.location = startRange.length + startRange.location;
            endRange.length   = [tempStr length] - endRange.location;
            endRange = [tempStr rangeOfString:@"}" options:NSCaseInsensitiveSearch range:endRange];

            if (endRange.location != NSNotFound)
            {
                // bracets found: retrieve string between them
                startRange.location += startRange.length;
                startRange.length = endRange.location - startRange.location;

                //result = [tempStr substringWithRange:startRange];
                [result appendString:[NSString stringWithFormat:@"%@ ",[tempStr substringWithRange:startRange]]];
                NSLog(@"%@ ",result);

            }
        }
    }

Позаботьтесь о release для tempArray и result

...