Разбор NSString с правой стороны? - PullRequest
1 голос
/ 26 января 2012
>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2009&nbsp;RX7)</font></td>
>monospace" size="-1">214869&nbsp;(2007&nbsp;PAZ)</font></td>
>monospace" size="-1">&nbsp;&nbsp;4155&nbsp;Accord</font></td>

Интересно, если кто-нибудь может предложить мне небольшую помощь, у меня есть список элементов NSString (см. Выше), с которых я хочу проанализировать некоторые данные.Моя проблема в том, что нет никаких тегов, которые я могу использовать в строках, а также элементы, которые я хочу, имеют фиксированные позиции.Данные, которые я хочу извлечь:

2009 RX7
2007 PAZ
4155 Accord

Я думаю, что будет легче разобрать с правого конца, удалить </font></td> и затем использовать ";"для разделения элементов данных:

(2009&nbsp RX7)
(2007&nbsp PAZ)
4155&nbsp Accord

, которые можно очистить в соответствии с приведенным примером.Любые указания по выполнению этого или проработке справа будут очень благодарны.

Ответы [ 4 ]

1 голос
/ 26 января 2012

Лично я думаю, что вам лучше с регулярным выражением. Таким образом, мое решение будет:

Регулярное выражение: ([0-9]+)[^;]+;([A-Za-z0-9]+)

Который для всего текста примера содержит 3 совпадения. то есть для:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2009&nbsp;RX7)</font></td>

0: 2009&nbsp;RX7)<

1: 2009

2: RX7

Я не кодировал это, но тестировал Regex на www.regextester.com

Регулярные выражения реализуются через NSRegularExpression и доступны в iOS 4.0 и более поздних версиях.

Редактировать

Учитывая, что это веб-приложение, вы никогда не знаете, когда эти надоедливые обезьяны HTML-кода изменят свой вывод и нарушат вашу тщательно разработанную методологию сопоставления. Поэтому я бы изменил свое регулярное выражение на:

([0-9]+)([^;]+;)+([A-Za-z0-9]+)

Добавляет дополнительную группу, но допускает любое количество элементов &nbsp; между числом и строкой.

1 голос
/ 26 января 2012

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

NSString *str = @">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2009&nbsp;RX7)</font></td>";
NSRange fontRange = [str rangeOfString:@"</Font>" options:NSBackwardsSearch];
NSRange lastSemi = [str rangeOfString:@";" options:NSBackwardsSearch range:NSMakeRange(0, fontRange.location-1)];
NSRange priorSemi = [str rangeOfString:@";" options:NSBackwardsSearch range:NSMakeRange(0, lastSemi.location-1)];
NSString *yourString = [str substringWithRange:NSMakeRange(priorSemi.location+1, fontRange.location-1)];

Ключевым элементом здесь является NSBackwardsSearch опция поиска.

0 голосов
/ 26 января 2012

Использование NSRegularExpression:

NSRegularExpression *regex;
NSTextCheckingResult *match;

NSString *pattern = @"([0-9]+)&nbsp;([A-Za-z0-9]+)[)]?</font></td>";
NSString *string = @">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2009&nbsp;RX7)</font></td>";

regex = [NSRegularExpression
         regularExpressionWithPattern:pattern
         options:NSRegularExpressionCaseInsensitive
         error:nil];


match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
NSLog(@"'%@'", [string substringWithRange:[match rangeAtIndex:1]]);
NSLog(@"'%@'", [string substringWithRange:[match rangeAtIndex:2]]);

Вывод NSLog:

'2009'
'RX7'

0 голосов
/ 26 января 2012

Это должно сработать:

NSString *s = @">monospace\" size=\"-1\">&nbsp;&nbsp;4155&nbsp;Accord</font></td>";
NSArray *strArray = [s componentsSeparatedByString:@";"];
// you're interested in last two objects
NSArray *tmp = [strArray subarrayWithRange:NSMakeRange(strArray.count - 2, 2)];

В tmp у вас будет что-то вроде:

"4155&nbsp",
"Accord</font></td>"

удалите ненужные символы, и все готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...