【问题标题】:iOS How to find multiple strings between 2 strings in a huge string?iOS如何在一个巨大的字符串中的2个字符串之间找到多个字符串?
【发布时间】:2015-10-27 09:53:29
【问题描述】:

我有一个混乱的NSString 假设

dsadasdasd"my_id": "qwerr"dcdscsdcds"my_id": "oytuj"adasddasddsddaS"my_id": "sjghjgjg"ddsfsdfsdf

如何找到字符串之间的每个实例

"my_id": "

还有下一个

"

所以在这里,我希望结果是 NSArray 的:

qwerr
oytuj
sjghjgjg

我正在寻找提示,正则表达式或任何其他解决方案都会很好。我尝试了多种使用NSRangesubstringWithRange 组合的方法,但无法使用。

【问题讨论】:

  • "my_id": " 是不变的吗? (即总是相同长度的相同字符串,中间有空格等)
  • @Arc676 是的,它将始终保持相同的长度和冒号和双引号之间的空格
  • 那么你不需要正则表达式,如果你可以用一个已知的子字符串分割。
  • @Larme 如果你很好奇,我正在努力恢复严重损坏的巨大 json 文件。原始字符串是许多“my_id”的组合,而恢复最多的唯一方法是获取所有“my_id”,然后通过获取有关这些 id 的信息来重新创建 json。 stribizhev 的以下解决方案之一在适应我损坏的 json 文件字符串后完美运行。
  • @Larme 是的,我通常将 json 转换为 nsdictionary 进行解析。但是这个是不可能的,因为它已经损坏了。

标签: ios objective-c regex nsstring substring


【解决方案1】:

我忽略了结束报价的要求。好吧,在这种情况下,有或没有正则表达式的代码在长度上是相似的。

这是一个正则表达式建议,它基本上提取"my_id": " 之后的所有子字符串,直到下一个" 或字符串结尾:

NSError *error = nil;
NSString *pattern = @"\"my_id\": \"([^\"]+)";
NSString *string = @"dsadasdasd\"my_id\": \"qwerr\"dcdscsdcds\"my_id\": \"oytuj\"adasddasddsddaS\"my_id\": \"sjghjgjg\"ddsfsdfsdf";
NSRange range = NSMakeRange(0, string.length);
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];
NSArray *matches = [regex matchesInString:string options:0 range:range];
for (NSTextCheckingResult* match in matches) {
    NSRange group1 = [match rangeAtIndex:1];
    NSLog(@"group1: %@", [string substringWithRange:group1]);
}

IDEONE demo

【讨论】:

  • 非常感谢,这非常有效!如果你很好奇,我正在努力恢复巨大的 json 文件。原始字符串是许多“my_id”的组合,而恢复最多的唯一方法是获取所有“my_id”,然后通过获取有关这些 id 的信息来重新创建 json。此解决方案在适应我的 json 文件字符串后完美运行。
【解决方案2】:

你可以试试这样的正则表达式:

"my_id": "\K[^"]+

Regex live here.

或者这个:

(?<="my_id": ")[^"]+

希望对你有帮助。

【讨论】:

  • 谢谢,上述解决方案之一运行良好,所以我接受了!也感谢您的回答!
【解决方案3】:

你的标题说“巨大”的字符串。我假设你不知道会有多少次出现。

我会使用NSMutableStringNSRange。请参阅NSMutableString documentationNSString docNSRange doc

免责声明:此代码未经测试且不使用正则表达式,因为这是一种替代方法,正则表达式可能不是解决此问题的正确解决方案(由另一位评论者支持)。

NSMutableString *string = //mutable copy of however you get the "jumbled" string
//To get the mutable copy use [string mutableCopy]
NSMutableArray *array = [NSMutableArray array]; //new array
NSRange *range = [string rangeOfString:@"\"my_id\": \""]; //find the my_id part
while (range.location != -1){ //if not found, location is -1
    //delete the irrelevant parts of the string (you should keep a copy of the original)
    //the length of the my_id part is 10
    [string deleteCharactersInRange:NSMakeRange(0, range.location - 1 + 10)];
    NSRange *end = [string rangeOfString:@"\""]; //find the next " char
    NSString *str = [string substringToIndex:end.location]; //get the relevant part
    [array addObject:str]; //save it
    [string deleteCharactersInRange:NSMakeRange(0, end.location)];
    range = [string rangeOfString:@"\"my_id\": \""];
}

【讨论】:

  • 谢谢,上面的解决方案之一效果很好,所以我接受了!您的解决方案可能有效,但上述解决方案更短。
猜你喜欢
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 2021-03-13
  • 2018-01-02
相关资源
最近更新 更多