【发布时间】:2009-10-23 09:31:14
【问题描述】:
我有一个空格分隔的字符串,例如@"abc xyz http://www.example.com aaa bbb ccc"。
如何从中提取子字符串@"http://www.example.com"?
【问题讨论】:
标签: objective-c nsstring
我有一个空格分隔的字符串,例如@"abc xyz http://www.example.com aaa bbb ccc"。
如何从中提取子字符串@"http://www.example.com"?
【问题讨论】:
标签: objective-c nsstring
我知道这是一个很晚的回复,但是您可以使用以下代码获取子字符串“http://www.abc.com”:
[@"abc xyz http://www.abc.com aaa bbb ccc" substringWithRange:NSMakeRange(8, 18)]
当然,您仍然可以为此使用NSString。
【讨论】:
[@"Some string" length] 并将该数字添加到第一个以找到第二个。
试试这个:
[yourString substringToIndex:<#(NSUInteger)#>];
//or
[yourString substringFromIndex:<#(NSUInteger)#>];
//or
[yourString substringWithRange:<#(NSRange)#>];
【讨论】:
如果您的所有子字符串都用空格分隔,您可以尝试使用[myString componentsSeparatedByString:@" "] 获取子字符串数组。然后你可以检查结果
[NSUrl URLWithString:yourSubstring]。如果子字符串不是正确的链接,它将返回 nil。
【讨论】:
这是我的脚本版本...希望它干净且易于实现。 它根据限制对字符进行 substr... 我的用于 textarea,但显然可以适应 textfields :)
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
int maxLength = 100;
int currentLength = [self.messageField.text length];
if( currentLength > maxLength )
{
NSString *newMessageText = [self.messageField.text substringWithRange:NSMakeRange(0, maxLength)];
[self.messageField setText:newMessageText];
return NO;
}
else
{
return YES;
}
}
【讨论】:
这个也可以尝试解决这个问题:
NSArray *data = [@"abc xyz http://www.abc.com aaa bbb ccc" componentsSeparatedByString:@" "];
for(NSString* str in data)
{
if([NSURLConnection canHandleRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:str]]])
NSLog(@"%@",[[NSString alloc ] initWithFormat:@"Found a URL: %@",str]);
}
希望对你有帮助!
【讨论】:
我发现 PHP 的 substr() 非常方便。如果您希望能够执行以下操作,请查看我的 NSString category:
substr(@"abc xyz http://www.example.com aaa bbb ccc", 8,-12)
或
substr(@"abc xyz http://www.example.com aaa bbb ccc", 8, 18)
两者都会给你http://www.example.com的结果
这是相关代码的副本:
__attribute__((overloadable))
NSString *substr(NSString *str, int start)
{
return substr(str, start, 0);
}
__attribute__((overloadable))
NSString *substr(NSString *str, int start, int length)
{
NSInteger str_len = str.length;
if (!str_len) return @"";
if (str_len < length) return str;
if (start < 0 && length == 0)
{
return [str substringFromIndex:str_len+start];
}
if (start == 0 && length > 0)
{
return [str substringToIndex:length];
}
if (start < 0 && length > 0)
{
return [[str substringFromIndex:str_len+start] substringToIndex:length];
}
if (start > 0 && length > 0)
{
return [[str substringFromIndex:start] substringToIndex:length];
}
if (start > 0 && length == 0)
{
return [str substringFromIndex:start];
}
if (length < 0)
{
NSString *tmp_str;
if (start < 0)
{
tmp_str = [str substringFromIndex:str_len+start];
}
else
{
tmp_str = [str substringFromIndex:start];
}
NSInteger tmp_str_len = tmp_str.length;
if (tmp_str_len + length <= 0) return @"";
return [tmp_str substringToIndex:tmp_str_len+length];
}
return str;
}
【讨论】:
可能的解决方案是使用正则表达式。查看RegexKit。
【讨论】:
如果您的输入字符串具有简单的保证(例如保证字符串中的标记始终由空格字符描述),则在空格字符上拆分并测试每个元素的 @"http://" 作为前缀。
NSString *input = @"abc xyz http://www.example.com aaa bbb ccc";
NSArray *parts = [input componentsSeparatedByString:@" "];
for (NSString *part in parts) {
if ([part hasPrefix:@"http://"]) {
// Found it!
}
}
这可以根据应用程序的需要进行优化;例如,选择在找到元素后使循环短路,或使用 BlocksKit 中的过滤器仅获取以前缀开头的元素。一个理想的解决方案将取决于输入字符串的性质以及您尝试使用它完成的任务。
【讨论】: