从右侧解析NSString?

时间:2012-01-26 13:25:56

标签: iphone objective-c xcode cocoa-touch

>&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 个答案:

答案 0 :(得分:1)

试试这段代码:

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搜索选项。

答案 1 :(得分:1)

就我个人而言,我认为你最好使用正则表达式。所以我的解决方案是:

正则表达式:([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

我没有对此进行编码,但确实在www.regextester.com

测试了正则表达式

正则表达式是通过NSRegularExpression实现的,可在iOS 4.0及更高版本中使用。

修改

鉴于这似乎是一个网络抓取应用程序,你永远不知道那些讨厌的HTML代码猴子什么时候会改变他们的输出并打破你精心设计的匹配方法。因此,我会将我的正则表达式改为:

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

其中添加了一个额外的组,但允许在数字和字符串之间添加任意数量的&nbsp;元素。

答案 2 :(得分:0)

这应该可以解决问题:

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>"

删除不需要的字符,你就完全了。

答案 3 :(得分:0)

使用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'