【问题标题】:Create Array of Twitter Handles from String从字符串创建 Twitter 句柄数组
【发布时间】:2014-10-20 16:19:12
【问题描述】:

我正在寻找一种方法来分析字符串并创建一个包含所有@Handles 的数组(如 Twitter)。稍加改动,@Handles 可以包含句点“。”

所以:@Username、@User_Name 或 @User.Name。

我的方法是使用 RegEx,但我似乎遇到了一个错误,我不确定我是如何产生的。

我的字符串是“@Albert and @David_Man and @Bob.Joe”,但返回的用户名数组是“@Albert, @David, @Bob”,RegEx 忽略了下划线和句点。

这是我的代码:

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"@([a-zA-Z0-9_\\.]{0,30})" options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *matches = [regex matchesInString:myString options:0 range:NSMakeRange(0, myString.length)];

【问题讨论】:

  • @AvinashRaj 那时什么也没返回 /:

标签: ios objective-c regex nsstring


【解决方案1】:

也许你应该试试这个......

NSRegularExpression *regexForUserNameTag = [NSRegularExpression regularExpressionWithPattern: @"@[A-Za-z0-9._]{0,30}" options:0 error:&error];
NSArray *matchesUserName = [regexForUserNameTag matchesInString:yourString options:0 range:NSMakeRange(0, yourString.length)];
for (NSTextCheckingResult *match in matchesUserName) {
    NSRange wordRange = [match rangeAtIndex:0];
    NSString* word = [yourString substringWithRange:wordRange];
    [usernames addObject: word];
}

【讨论】:

  • 同样的问题,没有得到“_”和“.”
  • 复制粘贴您的代码,仍然无法正常工作...当用户名有句点和下划线时,它会抓取用户名而不是用户名,例如@User.name_one 只返回“@User”。
  • 我认为这是正则表达式...我对 RegEx 了解不多,但我认为您的搜索字符串“@(\\w+)”只会返回以“@”为前缀的 WORDS ”。 "user.name_one" 将被视为 3 个单词,中间没有单词。
  • 谢谢! @[A-Za-z0-9._]{0,30}
【解决方案2】:
NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"@([a-zA-Z0-9_\\.]{0,30})" options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *matches = [regex matchesInString:myString options:0 range:NSMakeRange(0, myString.length)];
NSMutableArray *usernames = [NSMutableArray array];
for (NSTextCheckingResult *match in matches) {
  [usernames addObject:[myString substringWithRange:match.range]];
}

【讨论】:

  • 对不起,你有什么改变吗?我仍然得到相同的结果
  • 我没有更改您的三行中的任何内容。我的印象是你有一个工作的 RE,你只是想得到数组。
  • 啊,好吧!我的道歉哈哈
【解决方案3】:
NSArray *badChars = @[".", ",", ";", ...]; //chars you don't want to be in username
NSString *string = "@Albert and @David_Man and @Bob.Joe";
NSArray *array = [string componentsSeparatedByString:@" "];
for(int i=array.count-1;i>0;i--){
    NSString *str=array[i];
    if(![str[0] isEqual:@"@"]){[array removeObjectAtIndex:i]}
    for(NSString *badChar in badChars){
         str = [str stringByReplacingOccurencesOfString:badChar withString:""];
    }
}

【讨论】:

  • 这仅适用于我硬编码的特定字符串...代码需要能够解析用户输入字符串并删除用户名。
  • 在从同一个数组中删除元素的同时朝正方向迭代非常危险。相反,您应该进行否定迭代,或复制到不同的数组。
猜你喜欢
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
相关资源
最近更新 更多