2014-09-14 4 views
1
NSString *infix = @"4+23-54/543*23"; 
NSCharacterSet *operatorSet = [NSCharacterSet characterSetWithCharactersInString:@"+-*/"]; 
NSArray *tokens = [infix componentsSeparatedByCharactersInSet:operatorSet]; 

tokens возвращается:NSString: componentsSeparatedByCharactersInSet включительно

[@ "4", @ "23", @ "54", @ "543", @ "23"]

Я пытаюсь реализовать Shunting Yard в Objective-C. Как я могу токенизировать строку infix с набором операторов, не удаляя оператор, установленный сам из токенизации?

Что мне нужно:

[@ "4", @ "+", @ "23", @ "-", @ "54", @ "/", @ "543", @ "*", @ "23"]

+1

Я думаю, 'componentsSeparatedByCharactersInSet:' это просто неправильный инструмент для этого. Посмотрите на NSScanner. – vikingosegundo

+0

Да, странно, что функция, которую вы желаете, отсутствует в функциях NSString. –

+0

NSCharacterSet имеет 'inverseSet'. Таким образом, вы можете отделить обратное ... но вы, вероятно, потеряете необходимый порядок. – stevesliva

ответ

0

Если вы хотите использовать regEx, вы можете вставить пробел до и после операторов, а затем разбить строку пробелами.

NSString *infix = @"4+23-54/543*23"; 
NSRegularExpression *regexp = [NSRegularExpression regularExpressionWithPattern:@"([+,*,/,-])" options:0 error:NULL]; 
NSString *newString = [regexp stringByReplacingMatchesInString:infix options:0 range:NSMakeRange(0, infix.length) withTemplate:@" $1 $2"]; 
NSArray *tokens = [newString componentsSeparatedByString:@" "]; 
Смежные вопросы