如何在NSString中找到END_OF_LINE或WHITESPACE字符

时间:2013-02-12 16:50:06

标签: ios nsstring string-formatting nsrange

我正在尝试解析可能包含网址的推文。我想在推文的其余部分中使用不同的颜色/字体格式化网址。很明显,网址可以放在文本的任何位置。所以我有一个看起来像这样的类别方法:

NSString *urlString = @"";
NSRange startRange = [self rangeOfString:@"http://" options:NSCaseInsensitiveSearch];

if (startRange.length) {
    NSString *subStr = [self substringFromIndex:startRange.location];
    NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSRange endRange = [subStr rangeOfCharacterFromSet:set];

    if (endRange.length) {
        NSRange finalRange;
        finalRange.location = startRange.location;
        finalRange.length = endRange.location - 1;
        NSString *finalString = [self substringWithRange:finalRange];
        debugTrace(@"finalString : %@", finalString);
    }
}

return urlString;

所以基本上我在文本中找到http://的范围,然后从那里到最后创建一个子字符串。从那里我寻找第一个whitespaceAndNewlineCharacterSet并使用它作为url的结尾来找到finalString。但是,行

NSRange endRange = [subStr rangeOfCharacterFromSet:set];

返回垃圾值,这让我觉得我没有使用正确的NSCharacterSet来查找endRange

Printing description of endRange: (NSRange) endRange = location=2147483647, length=0

我如何解决这个问题,以便找到网址的结束位置。

1 个答案:

答案 0 :(得分:4)

正如我的评论中所提到的,它不是垃圾范围值,它是NSNotFound的表示。这意味着您传递的字符串中没有出现空格或换行符(这是一个有效的例子)。因此,我们需要做好准备。

根据您的代码,我已将其更改为检查NSNotFound。此外,无需从finalRange长度中减去1。当我测试此代码示例时,会从我的URL字符串中裁剪出最后一个字符。评论已添加到已更改/查询的行的末尾。

NSString *urlString = @""; // Is this being used?
NSRange startRange = [self rangeOfString:@"http://" options:NSCaseInsensitiveSearch];

if (startRange.length) {
    NSString *subStr = [self substringFromIndex:startRange.location];
    NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    NSRange endRange = [subStr rangeOfCharacterFromSet:set];

    if (endRange.location == NSNotFound) { // Check for NSNotFound
        debugTrace(@"finalString : %@", subStr); 
    }
    else if (endRange.length) {
        NSRange finalRange;
        finalRange.location = startRange.location;
        finalRange.length = endRange.location; // No need to subtract 1
        NSString *finalString = [self substringWithRange:finalRange];
        debugTrace(@"finalString : %@", finalString);
    }
}

return urlString;

我已经对此进行了简要测试,似乎有效。