【问题标题】:Substring after substring in NSStringNSString 中子字符串后的子字符串
【发布时间】:2013-04-06 11:57:54
【问题描述】:

我是新的目标,我正面临我的第一个问题,我无法继续我的第一个项目。

这很简单,我有一个 NSString :

NSString *myString = @"<font face='Helvetica' size=25 color='#d79198'> Here is some text !</font>"; 

我想要做的是获得大小“25”的值,它总是 2 个字符长,所以我可以计算我的 UILabel 大小。

我知道如何检测是否有我正在寻找的子字符串 "size=" 使用:

if ([string rangeOfString:@"bla"].location == NSNotFound)

但我还没有找到或不明白如何提取字符串 @"size=XX" 然后从 *myString 获取 XX 作为 NSString

感谢您的帮助。

【问题讨论】:

  • 一般来说,你可以使用“正则表达式”,也可以使用 componentsSeparatedByString。对于后者,您可能需要使用 hasPrefix 检查每个生成的“组件”以找到以“size =”开头的那个。

标签: iphone ios objective-c nsstring substring


【解决方案1】:
NSString *myString = @"<font face='Helvetica' size=25 color='#d79198'> Here is some text !</font>";
NSRange range = [myString rangeOfString:@"size="];
if (range.location != NSNotFound)
{
    NSLog(@"Found \"size=\" at %d", range.location);
    NSString *sizeString = [myString substringWithRange:NSMakeRange(range.location+5, 2)];
    NSLog(@"sizeString: %@", sizeString);
}


这应该可以解决问题。最后你也可以这样做:int sizeFont = [sizeString intValue];

【讨论】:

  • 请注意,如果未找到目标字符串,则 rangeOfString 返回 length==0。所以检查长度比位置好。如果接收者为 nil,则长度和位置都返回为 0,而不是 NSNotFound。
【解决方案2】:
NSString *myString = @"<font face='Helvetica' size=25 color='#d79198'> Here is some text !</font>";
    if ([myString rangeOfString:@"size"].location != NSNotFound)
    {
        myString = [myString substringFromIndex:[myString rangeOfString:@"size"].location]; 
        myString = [myString substringToIndex:[myString rangeOfString:@" "].location]; // Now , myString ---> size=25 color='#d79198'> Here is some text !</font> 
        myString = [myString substringFromIndex:[myString length]-2];// Now, myString ---> size=25
        NSLog(@"myString -- %@",myString); // Now, myString ---> 25
    }

【讨论】:

【解决方案3】:

如果您有类似 stack:overflow 的字符串,请按以下方式使用它:

 NSString *Base=@"stack:overflow"
 NSString *one  = [[Base componentsSeparatedByString:@":"] objectAtIndex:0];
 NSString *two  = [[Base componentsSeparatedByString:@":"] objectAtIndex:1];

在这种情况下,一 = 堆栈,二 = 溢出

【讨论】:

    【解决方案4】:

    HTML 页面的一部分?然后use the tool that is designed for the task

    【讨论】:

    • 这个答案有什么问题?这是目前唯一正确的答案
    • 我不使用这个,因为 UILabel 有颜色
    【解决方案5】:

    您可以自己计算数字的范围或使用非常简单的正则表达式来获取子字符串,例如

    (?<=size\=)\d*
    

    这意味着您正在搜索以“size=”((?&lt;=size\=))开头的数字(\d*

    使用 NSRegularExpression 会是

    NSError *error = NULL;
    NSRegularExpression *regex = 
      [NSRegularExpression regularExpressionWithPattern:@"(?<=size\\=)\\d*" 
                                                options:0 
                                                  error:&error];
    NSTextCheckingResult *match = 
      [regex firstMatchInString:myString 
                        options:0 
                          range:NSMakeRange(0, [myString length])];
    NSString *sizeText = [myString substringWithRange:match.range];
    

    最后,您应该使用

    将文本 "25" 转换为数字
    NSInteger size = [sizeText integerValue];
    

    【讨论】:

    • 我第一次使用 NSRegularExpression,感谢大卫的提示。
    【解决方案6】:

    使用componentsSeparatedByString:方法...

    NSString *myString = @"<font face='Helvetica' size=25 color='#d79198'> Here is some text !</font>";
        NSString *theSizeString = [[[[myString componentsSeparatedByString:@" "] objectAtIndex:2] componentsSeparatedByString:@"="] objectAtIndex:1];
        NSLog(@"The sizestring:%@",theSizeString);
    

    我认为这对你会有帮助。

    【讨论】:

      【解决方案7】:

      你可以得到字符串@"size="的范围。范围有位置和长度。所以接下来你需要调用myString substringWithRange: 方法。参数将是一个NSRage,从@"size=" 的位置+长度和2 的长度开始。

      【讨论】:

        猜你喜欢
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多