Нужна помощь в форматировании текста / поиск строки по разному числу - PullRequest
1 голос
/ 28 января 2011

Я только начинаю с obj-c, и хотя я могу искать простые вещи в строке, я не до такой степени, что могу искать неожиданные вещи.

У меня есть фрагмент отформатированного текста, который всегда будет выглядеть аналогично этому. Чего я не знаю, так это как вытащить определенные кусочки. Я могу создать строку if и найти определенные фрагменты, но я не уверен, что это правильный путь. Я даже не уверен, является ли создание строки лучшим способом.

То, что я сейчас ищу, это большой блайнд, это самый последний номер в тексте ниже. Это не всегда будет в одном месте персонажа из-за разных имен игроков. Это не всегда будет последним, есть конечный текст, который я не опубликовал.

Я могу искать «большой блайнд», затем сдвигать диапазон, чтобы найти числа, но это число не всегда будет одинаковым, и я не знаю, как это разрешить. Я использую subStringWithRange прямо сейчас, чтобы найти то, что я хочу.

Я могу получить индекс первого числа, но как мне разрешить 2-4 цифры? Если бы я установил значение 4 прямо сейчас, это дало бы мне ошибку вне диапазона.

Full Tilt Poker Game #27219594154: $1 + $0.20 Sit & Go (Turbo) (211520821), Table 1 -
20/40 - No Limit Hold'em - 18:52:12 ET - 2011/01/12
Seat 1: Twigee (1,485)
Seat 2: tsaf21 (1,508)
Seat 3: dddewdddew (1,385)
Seat 4: MagMan1 (1,770)
Seat 5: Clyde the Fish (1,430)
Seat 6: Lazaro16 (1,340)
Seat 7: ascualliin (1,285)
Seat 8: aipeter (1,730)
Seat 9: AlligatorLega (1,567)
aipeter posts the small blind of 20
AlligatorLega posts the big blind of 40

Я очень ценю помощь! Пока что все в Overflow были потрясающими!

Спасибо

Graham

Ответы [ 2 ]

2 голосов
/ 28 января 2011

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

NSString *text = // Create the text string however you're currently creating it.

// Break the string into an array of strings, one for each line.
NSArray *lines = [text componentsSeparatedByString:@"\n"];
// Get the last line.
NSString *lastLine = [lines lastObject];

// Break the line into an array of words.
NSArray *words = [lastLine componentsSeparatedByString:@" "];
// Get the last word.
NSString *lastWord = [words lastObject];

// If you need to convert the string to a numeric type...
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:lastWord];
NSLog(@"%@", number);

Другой подход заключается в использовании экземпляра NSScanner для сканирования интересующих вас фрагментов текста. Это немного сложнее и требует немного большего понимания C и Objective-C, но здесь идет речь :

// Create an instance of NSScanner containing the text
NSScanner *scanner = [NSScanner scannerWithString:text];

// Scan up to the words preceding the text you're interested in.
[scanner scanUpToString:@"big blind of " intoString:NULL];
// Skip past that part.
[scanner scanString:@"big blind of " intoString:NULL];

NSString *numericString;
// Scan the next substring. Here I'm assuming it's at the end of a line,
// so we're scanning until the newline character. Note that the numeric
// string will be created during the call to this method.
[scanner scanUpToString:@"\n" intoString:&numericString];

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:numericString];
NSLog(@"%@", number);

EDIT

Кстати, вы можете фильтровать массив строк, используя экземпляр NSPredicate следующим образом:

// Break the string into an array of strings, one for each line.
NSArray *lines = [text componentsSeparatedByString:@"\n"];

// Filter the array of lines down to only those containing a given substring.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS 'big blind'"];
NSArray *matchingLines = [lines filteredArrayUsingPredicate:predicate];

// Make sure that the array is not nil or empty.
if ([matchingLines count] > 0)
{
    // Get the first item in the array of matching lines.
    NSString *firstMatch = [matchingLines objectAtIndex:0];

    // Now break up the line up into words as before, or use an
    // instance of NSScanner to scan the substring based on its position
    // relative to other substrings.
    NSArray *words = [firstMatch componentsSeparatedByString:@" "];
    NSString *lastWord = [words lastObject];
    NSLog(@"%@", lastWord);
}
1 голос
/ 28 января 2011

Хотя вы можете использовать собственные методы NSString для сканирования строки, использования подстрок и всего такого джаза, это действительно хорошее место для использования регулярных выражений. Похоже, вы будете много разбирать эти данные, и из-за этой работы сканирования / подстроки будет гигантская боль. Вот регулярное выражение, которое соответствует только той строке, о которой вы говорите, и дает вам два захвата:

([\w]+[^\w]*?) posts the big blind of ([\d]*)

Первый захват - это имя пользователя, который отправил большой блайнд (я знаю, что вы не просили об этом, но держу пари, что это будет полезно), а второй захват - это номер. Более новые версии iOS содержат класс NSRegularExpression для использования регулярных выражений, но если вам требуется поддержка более старого программного обеспечения, я настоятельно рекомендую RegexKitLite для Mac и iOS.

...