从iPhone中的数组中检索NSString

时间:2011-09-22 09:25:15

标签: iphone nsstring nsarray

我有一个数组,其中包含地图上路线的描述。我通过解析JSON得到了这个数组。我的数组包含以下格式的字符串:

    "<b>Sri Krishna Nagar Rd</b> \U306b\U5411\U304b\U3063\U3066<b>\U5317\U6771</b>\U306b\U9032\U3080",


"\U53f3\U6298\U3057\U3066\U305d\U306e\U307e\U307e <b>Sri Krishna Nagar Rd</b> \U3092\U9032\U3080",


        "\U5927\U304d\U304f\U5de6\U65b9\U5411\U306b\U66f2\U304c\U308a\U305d\U306e\U307e\U307e <b>Bailey Rd/<wbr/>NH 30</b> \U3092\U9032\U3080<div class=\"\">\U305d\U306e\U307e\U307e NH 30 \U3092\U9032\U3080</div><div class=\"google_note\">\n<b landmarkid=\"0x39ed57bfe47253b7:0x779c8bf48892f269\" class=\"dir-landmark\">Petrol Bunk</b>\U3092\U901a\U904e\U3059\U308b<div class=\"dirseg-sub\">\Uff083.9&nbsp;km \U5148\U3001\U53f3\U624b\Uff09</div>\n</div>",

现在我想从Sri Krishna Nagar RdNH 30 Petrol Bunk获取此数组中的地点名称。前两个应该提供Sri Krishna Nagar Rd,最后一个应该给NH 30 Petrol Bunk 我怎么能得到这样的结果。任何帮助将不胜感激。 Thanx In Advance。

再次,假设我有这种格式的字符串... "\U5de6\U6298\U3059\U308b",它没有地名。我将如何处理这种情况。

3 个答案:

答案 0 :(得分:5)

    You can get like below:


  NSString *strName=[yourArray objectAtIndex:index];

    NSString *yourPlaceString=[[strName componentsSeparatedByString:@"<b>"] objectAtIndex:1];
    yourPlaceString=[[yourPlaceString componentsSeparatedByString:@"</b>"] objectAtIndex:0];

    you can get all places like this.

答案 1 :(得分:3)

首先,您应该检查您是否没有任何其他更清洁的API可供您查询此数据的服务。如果服务在其JSON响应中返回了这样的垃圾,那么这不应该是你清理那个烂摊子的责任:如果它是真正干净的API,服务应该返回一些更有用的文本。

接下来,如果你真的没有其他选择并且真的需要清理这个文本,你有两个选择:

  • 如果文本是XHTML(我的意思是真正的XHTML,符合XML标准),您可以使用NSXMLParser过滤掉任何标记,只保留字符串中的文本。无论如何这可能有点太多了,所以我真的不推荐它。
  • 您可以使用正则表达式。如果您正在为iOS4.0 +开发,可以使用NSRegularExpression类来实现此目的。棘手的部分是获得正确的正则表达式(如果需要可以帮助你)
  • 您可以使用NSScanner(自2.0 IIRC以来在iOS中可用)扫描字符串中的字符并解析它。如果你不是正则表达式专家,这可能更容易理解和走的路,所以我推荐这种方法

例如,如果您选择NSScanner解决方案,则可以扫描字符串中的字母数字字符集中的字符,扫描字母和数字并累积它(您还可以为您的{添加ponctuation字符) {1}}如果需要,您正在使用。当遇到诸如unicode字符\ Uxxxx或类似NSCharacterSetNSScanner之类的字符时,您将<停止。当您遇到>时,您可以要求<忽略下一个NSScanner之前的字符,然后再次开始扫描字母数字字符并累积......依此类推,直到字符串的结尾。


最后,如果您确实在收到的回复字符串中找到了一个模式,就好像您的地名始终位于第一个><b>对之间(但您必须确定),您可以通过其他方式处理它,例如:

  • 使用</b>文字作为分隔符(例如<b>
  • 拆分字符串
  • 或向componentsSeparatedByString询问字符串rangeOfString,然后询问字符串<b>,一旦获得其位置,只需从原始字符串中提取</b>以仅提取字符substringWithRange地名(使用rangeOfString会比componentsSeparatedByString更快,因为它会在第一次发现时停止)

答案 2 :(得分:1)

它看起来像编码问题 - 您可以将源或目标的编码更改为其他格式。当关闭UTF-8时,我遇到了德语öäü字符的类似问题....