gpt4 book ai didi

ios - NSScanner 基于最后一次出现的子字符串 "@"

转载 作者:行者123 更新时间:2023-11-29 10:55:14 25 4
gpt4 key购买 nike

我有一个用户名系统,类似于使用 @ 符号的推特。

我已将其设置为通过键入@username 向用户发送消息。这与 Twitter 中的提及基本相同。

到目前为止,我已经能够检测到@ 符号后面的文本,并在遇到空白时停止检测。 NSScanner 已经完美地做到了这一点。

我的问题是,如果我想向多个@usernames 发送消息,NSScanner 只会检测第一次出现的情况。我需要它来检测最近发生的事件。我发现这是一个有用的工具:

NSRange lastSymbol = [text rangeOfString:@"@" options:NSBackwardsSearch];

我似乎无法弄清楚如何将其与 NSScanner 一起正确使用。这是我的代码尝试的 2 个示例。

示例 1:

NSString *user = nil;
NSString *text = textView.text;

NSRange lastSymbol = [text rangeOfString:@"@" options:NSBackwardsSearch];

if (lastSymbol.location != NSNotFound) {

NSScanner *userScanner = [NSScanner scannerWithString:text];
[userScanner scanUpToString:@"@" intoString:nil];

NSCharacterSet *charset = [NSCharacterSet characterSetWithCharactersInString:@"@"];

if (![userScanner isAtEnd]) {

[userScanner scanUpToCharactersFromSet:charset intoString:nil];
[userScanner scanCharactersFromSet:charset intoString:nil]
[userScanner scanUpToCharactersFromSet:charset intoString:&user];


}
}


if (user.length > 0) {

NSRange whiteSpaceRange = [user rangeOfCharacterFromSet:[NSCharacterSet whitespaceCharacterSet]];
if (whiteSpaceRange.location != NSNotFound) {

// White space, username has ended

} else {

// Still getting username
NSLog(@"%@", user);

}

}

如您所见,我只是不太确定如何让这些一起工作以产生我正在寻找的结果。有任何想法吗?谢谢!

***************************更新******************** ********

更具体地说,当用户键入 @ 符号并开始键入用户名时,我想根据他们键入的内容显示他们的好友列表。所以很自然地,我想拉出 @ 符号后面的字符串,当用户不断输入时,不断更新他们的 friend 列表。一旦用户键入一个空格,我们就假设他们已经完成了用户名的键入(用户名不能包含空格),因此我将停止显示 TableView 。

到目前为止,上面的代码只是简单地检测并提取@ 符号后面的字符串。这是现在的输出:

文本域文本:你好@用户名

enter image description here

这非常有效,如您所见,我可以不断地与一群 friend 核对这篇文章。

假设用户想用相同的文本向另一个用户发送消息,如下所示:

你好@username,这是我的 friend @goodfriend

这次它仍然显示第一个@username,但忽略第二个@goodfriend。

我认为最好的方法是以某种方式告诉 NSScanner 引用最后一次出现的 @ 符号,因为我现在所拥有的只是引用第一个 @ 符号。

这也可能与我检测空白以了解用户已完成输入用户名并且不需要任何更多建议的方式有关。

希望对您有所帮助,谢谢!

最佳答案

对于这样的实时输入,我建议使用完全不同的方法。不要查找最后一个“@”,而是只查看最后一个词,看看它是否以“@”开头。

NSString *user = nil;
NSString *text = textView.text;
// Find the last whitespace character
NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];
NSRange lastWordRange = [text rangeOfCharacterFromSet:whitespace options:NSBackwardsSearch];
// If found, get the index after it. Otherwise, the entire string is one word.
if(lastWordRange.location != NSNotFound)
lastWordRange.location += lastWordRange.length;
else lastWordRange.location = 0;
// If the index is not at the end, look for a '@' right after it
if(lastWordRange.location < [text length] &&
[text characterAtIndex:lastWordRange.location] == '@') {
// Found a '@', use the rest of the string as the username
user = [text substringFromIndex:lastWordRange.location+1];
}
if(user) NSLog(@"%@", user); // The user is still typing a name

如果你真的想使用扫描仪,你可以使用相同的 substringFromIndex: 方法来获取要扫描的子字符串。

NSRange lastSymbol = [text rangeOfString:@"@" options:NSBackwardsSearch];
if (lastSymbol.location != NSNotFound) {
NSString *substring = [text substringFromIndex:lastSymbol.location];
NSScanner *userScanner = [NSScanner scannerWithString:substring];
...

关于ios - NSScanner 基于最后一次出现的子字符串 "@",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18677675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com