Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 获取ObjC中其他两个字符串之间的字符串 我试图解析一个字符串并在中间获得另一个字符串。< /P>_Iphone_Objective C - Fatal编程技术网

Iphone 获取ObjC中其他两个字符串之间的字符串 我试图解析一个字符串并在中间获得另一个字符串。< /P>

Iphone 获取ObjC中其他两个字符串之间的字符串 我试图解析一个字符串并在中间获得另一个字符串。< /P>,iphone,objective-c,Iphone,Objective C,即 你好,世界,这是一个字符串 我需要找到“世界”和“是”(这个)之间的字符串。我环顾四周,但还没有弄清楚,主要是因为我还不熟悉客观世界。。。有人知道如何使用正则表达式或不使用正则表达式吗?请参阅 如果你知道结果只有一个: NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\bworld\s+(.+)\s+is\b" options:0 error:NULL] NSTextC

你好,世界,这是一个字符串

我需要找到“世界”和“是”(这个)之间的字符串。我环顾四周,但还没有弄清楚,主要是因为我还不熟悉客观世界。。。有人知道如何使用正则表达式或不使用正则表达式吗?

请参阅

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

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 not a string”不匹配)。在world之后和is之前\s会吞噬所有空格。这个?找到你要找的东西,用?使其非贪婪,这样“hello world这是一个字符串hello world这是一个字符串”不会给你“this a string hello world this”

我将让您自己决定如何处理多个匹配项。NSRegularExpression文档应该可以帮助您解决此问题

如果要确保匹配不跨越句子边界,可以使用([^.]+?)而不是(+.+?),或者可以在字符串上使用EnumerateSubstringsRange:options:usingBlock:,并在选项中传递NSStringEnumerationByEntences


这些东西都需要4.0+。如果您想支持3.0+,请查看RegexKitLite。

如果它恰好是由空格分隔的字符串,您可以使用以下代码:或者

[string componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]


Jacques给出的正则表达式解决方案是可行的,而要求iOS 4.0及更高版本的警告是正确的。使用正则表达式的速度也相当慢,如果搜索表达式是已知的字符串常量,那就太麻烦了

您可以使用
NSString
上的方法或名为
NSScanner
的类来解决此问题,这两个类都是从iPhone OS 2.0开始提供的,早在那之前,Mac OS X 10.0之前就已经提供了:)

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

@interface NSString (CWAddition)
- (NSString*) stringBetweenString:(NSString*)start andString:(NSString*)end;
@end
没问题,我们假设应该返回
nil
,因为找不到这样的字符串

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

@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
类执行以下操作:

@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

只需对PeyloW的答案进行简单修改,即可返回开始字符串和结束字符串中的所有字符串:

-(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;

}

请注意,此解决方案不能确保world和is位于单词边界上。您可以添加更多代码来处理这一问题,但这可能会很棘手,因此我建议只使用正则表达式(NSRegularExpression或RegexKitLite for iOS 3)来简化处理所有紧急情况的过程。做一些分析,看看你是否需要手工编写一个解决方案。谢谢!我还要找到出现多次的字符串。。。HelloBye我假设我可以添加另一个参数(出现),然后循环开始字符串X次,对吗?我应该能够找到答案,特别是因为您给了我NSRange等的起点。再次感谢!是的,应该没问题。只需使用上一次搜索的范围来限制下一次搜索的搜索范围。答案很好,但在NSString扩展解决方案中,您应该防止在NSRange endRange=[self rangeOfString:end options:0 range:targetRange]之前找不到这样的结束字符串;语句,否则它将崩溃:NSRange checkEndRange=[self rangeOfString:end];如果(checkEndRange.location!=NSNotFound),感谢您的帮助!我需要支持OS3/iPad,所以这不是目前的选择。一旦iPadOS4面世,我就可以使用Regex切换到这个实现。。再添加一个参数作为“originalString”,并用它替换“self”。
-(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;

}