Erhan Demirci
Erhan Demirci

Reputation: 4209

Find dynamically word in NSString

NSString * stringExample1=@"www.mysite.com/word-4-word-1-1-word-word-2-word-817061.html";

NSString * stringExample2=@"www.mysite.com/word-4-5-1-1-word-1-5-word-11706555.html";

I try to find - and . Inside of NSString.

NSRange range = [string rangeOfString:@"-"];
NSUInteger start = range.location;
NSUInteger end = start + range.length;

NSRange rangeDot= [string rangeOfString:@"."];
NSUInteger startt = rangeDot.location;
NSUInteger endt = startt + rangeDot.length;

But it's can't be successful. It's showing first place. How can I get 817061 and 11706555 inside of Nstring?

Thank you .

Upvotes: 0

Views: 593

Answers (4)

Fr4ncis
Fr4ncis

Reputation: 1387

I think the best way to find the match is by using regulars expressions with NSRegularExpression.

NSString * stringEx=@"www.mysite.com/word-4-word-1-1-word-word-2-word-817061.html";

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"-(\\d*).html$"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                        error:&error];

NSArray *matches = [regex matchesInString:stringEx options:NSMatchingReportCompletion range:NSMakeRange(0, [stringEx length])];
if ([matches count] > 0)
{
    NSString* resultString = [stringEx substringWithRange:[matches[0] rangeAtIndex:1]];
    NSLog(@"Matched: %@", resultString);
}

Make sure you use an extra \ escape character in the regex NSString whenever needed.

UPDATE

I did a test using the two different approaches (regex vs string splitting) with the code below:

NSDate *timeBefore = [NSDate date];

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"-(\\d*).html$"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                        error:&error];

for (int i = 0; i < 100000; i++)
{
    NSArray *matches = [regex matchesInString:stringEx options:NSMatchingReportCompletion range:NSMakeRange(0, [stringEx length])];
    if ([matches count] > 0)
    {
        NSString* resultString = [stringEx substringWithRange:[matches[0] rangeAtIndex:1]];
    }
}

NSTimeInterval timeSpent = [timeBefore timeIntervalSinceNow];
NSLog(@"Time: %.5f", timeSpent*-1);

on the simulator the differences are not significant, but running on an iPhone 4 I got the following results:

2013-11-25 10:24:19.795 NotifApp[406:60b] Time: 11.45771 // string splitting
2013-11-25 10:25:10.451 NotifApp[412:60b] Time: 7.55713 // regex

so I guess the best approach depends on case to case.

Upvotes: 0

βhargavḯ
βhargavḯ

Reputation: 9836

Try this simple Regular Expression.

    NSString * stringExample1=@"www.mysite.com/word-4-word-1-1-word-word-2-word-84354354353.html";
    NSError  *error  = NULL;

    NSRegularExpression *regex = [NSRegularExpression
                                  regularExpressionWithPattern:@"(\\-\\d*\\.)"
                                  options:0
                                  error:&error];

    NSRange range              = [regex rangeOfFirstMatchInString:stringExample1
                                               options:0
                                                 range:NSMakeRange(0, [stringExample1 length])];
    range                      = NSMakeRange(range.location+1, range.length-2);
    NSString *result           = [stringExample1 substringWithRange:range];
    NSLog(@"%@",result);

Upvotes: 0

Pradhyuman sinh
Pradhyuman sinh

Reputation: 3928

Are you trying to find if it contains at least one of - or . ?

You can use -rangeOfCharacterFromSet:

NSCharacterSet *CharacterSet = [NSCharacterSet characterSetWithCharactersInString:@"-."];
NSRange range = [YourString rangeOfCharacterFromSet:CharacterSet];
if (range.location == NSNotFound) 
{
    // no - or . in the string
}
else 
{
    // - or . are present
}

Upvotes: 0

Jignesh Mayani
Jignesh Mayani

Reputation: 7193

This will work for you,

 NSArray *strArry=[stringExample1 componentsSeparatedByString:@"-"];

 NSString *result =[strArry lastObject];

 NSString *resultstring= [result  stringByReplacingOccurrencesOfString:@".html" withString:@""];

Upvotes: 4

Related Questions