首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ObjC中获取其他两个字符串之间的字符串

在ObjC中获取其他两个字符串之间的字符串
EN

Stack Overflow用户
提问于 2010-10-23 11:40:47
回答 4查看 15.7K关注 0票数 16

我正在尝试解析一个字符串,并在中间获取另一个字符串。

即。

Hello world这是一个字符串

我需要找到"world“和"is”(this)之间的字符串。我已经环顾了四周,但还没有弄清楚,主要是因为我对Objective C还不熟悉。有没有人知道该怎么做,不管有没有RegEx?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-23 21:25:11

雅克给出的正则表达式解决方案是有效的,并且需要iOS 4.0和更高版本的警告是正确的。使用正则表达式也相当慢,如果搜索表达式是已知的字符串常量,则会造成过度杀伤力。

您可以使用NSString上的方法或名为NSScanner的类来解决这个问题,这两个类从MacOS2.0开始就已经可用,甚至早在iPhone OSX10.0之前就已经可用了:)。

那么,您想要的是NSString上的一个新方法,就像这样?

代码语言:javascript
复制
@interface NSString (CWAddition)
- (NSString*) stringBetweenString:(NSString*)start andString:(NSString*)end;
@end

没问题,我们假设我们应该返回nil,因为找不到这样的字符串。

仅使用NSString的实现非常简单:

代码语言:javascript
复制
@implementation NSString (NSAddition)
- (NSString*) stringBetweenString:(NSString*)start andString:(NSString*)end {
    NSRange startRange = [self rangeOfString:start];
    if (startRange.location != NSNotFound) {
        NSRange targetRange;
        targetRange.location = startRange.location + startRange.length;
        targetRange.length = [self length] - targetRange.location;   
        NSRange endRange = [self rangeOfString:end options:0 range:targetRange];
        if (endRange.location != NSNotFound) {
           targetRange.length = endRange.location - targetRange.location;
           return [self substringWithRange:targetRange];
        }
    }
    return nil;
}
@end

或者,您可以使用NSScanner类进行实现:

代码语言:javascript
复制
@implementation NSString (NSAddition)
- (NSString*) stringBetweenString:(NSString*)start andString:(NSString*)end {
    NSScanner* scanner = [NSScanner scannerWithString:self];
    [scanner setCharactersToBeSkipped:nil];
    [scanner scanUpToString:start intoString:NULL];
    if ([scanner scanString:start intoString:NULL]) {
        NSString* result = nil;
        if ([scanner scanUpToString:end intoString:&result]) {
            return result;
        }
    }
    return nil;
}
@end
票数 33
EN

Stack Overflow用户

发布于 2012-02-10 20:26:11

只需对PeyloW的答案进行简单修改,即返回start和end字符串中的所有字符串:

代码语言:javascript
复制
-(NSMutableArray*)stringsBetweenString:(NSString*)start andString:(NSString*)end
{

  NSMutableArray* strings = [NSMutableArray arrayWithCapacity:0];

  NSRange startRange = [self rangeOfString:start];

  for( ;; )
  {

    if (startRange.location != NSNotFound)
    {

      NSRange targetRange;

      targetRange.location = startRange.location + startRange.length;
      targetRange.length = [self length] - targetRange.location;   

      NSRange endRange = [self rangeOfString:end options:0 range:targetRange];

      if (endRange.location != NSNotFound)
      {

        targetRange.length = endRange.location - targetRange.location;
        [strings addObject:[self substringWithRange:targetRange]];

        NSRange restOfString;

        restOfString.location = endRange.location + endRange.length;
        restOfString.length = [self length] - restOfString.location;

        startRange = [self rangeOfString:start options:0 range:restOfString];

      }
      else
      {
        break;
      }

    }
    else
    {
      break;
    }

  }

  return strings;

}
票数 12
EN

Stack Overflow用户

发布于 2010-10-23 12:16:54

请参阅ICU user guide on regular expressions

如果你知道只有一个结果:

代码语言:javascript
复制
NSRegularExpression *regex = [NSRegularExpression
    regularExpressionWithPattern:@"\bworld\s+(.+)\s+is\b" options:0 error:NULL]

NSTextCheckingResult *result = [regex firstMatchInString:string
    options:0 range:NSMakeRange(0, [string length]];

// Gets the string inside the first set of parentheses in the regex
NSString *inside = [string substringWithRange:[result rangeAtIndex:1]];

B确保在world之前和is之后有一个单词边界(所以"hello world this is‘t a string“不会匹配)。S会吞噬所有world之后和world之前的空格。.+?找到你要找的东西,用?让它不是贪婪的,所以"hello world this is a string hello world this is a string“不会给你"this a string hello world this”。

我将留给您来解决如何处理多个匹配的问题。NSRegularExpression文档应该会对您有所帮助。

如果你想确保匹配不会跨越句子边界,你可以这样做(^.+?)而不是(.+?),或者您可以对字符串使用enumerateSubstringsInRange:options:usingBlock:并在选项中传递NSStringEnumerationBySentences。

这些东西都需要4.0+。如果你想支持3.0+,可以看看RegexKitLite。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4002360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档