我是计算机科学专业的二年级学生,我写了一个程序,它连接到一个IRC客户端,嗅探等待用户问“推特是关于什么的?”
该程序嗅探关键字“推特”,然后运行一个方法,使用整个输入行查找推特句柄。
问题是,如果我在编译之前知道关键字是什么,我就知道如何查找关键字,但在这种情况下,关键字可能是任何twitter句柄,所以我不确定搜索它的最佳方法是什么。
我尝试了以下方法:inputLine。子字符串(i 1,inputLine.indexOf(“”);但它会使用输入行中的第一个空格作为第二个索引,这给了我一个IndexOutfBounds异常。
输入行的示例如下所示
:TWalk!46774664@gateway/web/freenode/ip.11.222.33.444 PRIVMSG #irchacks :What is @TWalkBot tweeting about right now?
这就是我掌握的代码,它实际上会抓住twitter的手柄。
/** This method parses the inputLine and returns the Twitter Handle */
public String getTwitterHandle(String inputLine) {
boolean firstAt = true;
char currentChar, tempChar;
for (int i = 0; i < inputLine.length(); i++) {
currentChar = inputLine.charAt(i);
if (currentChar == '@' && firstAt == false) {
for (int j = i; j < inputLine.length(); j++) {
tempChar = inputLine.charAt(j);
if (tempChar == ' ') {
return inputLine.substring(i + 1, j);
}
}
}
else if (currentChar == '@' && firstAt == true) {
firstAt = false;
}
}
return "User Not Found";
}
虽然这段代码确实有效,但我想知道是否有更有效的方法来实现这一点,如果是的话,我应该考虑如何改变?
谢谢
托马斯
是的,你可以使用正则表达式来简化它
public class RegExPattern {
public static void main(String[] args) {
String test1 = "What is @TWITTERHANDLE tweeting about?";
String test2 = ":TWalk!46774664@gateway/web/freenode/ip.11.222.33.444 PRIVMSG #irchacks :What is @TWalkBot tweeting about right now?";
Pattern pattern = Pattern.compile(".*@(\\w+).*tweeting.*");
Matcher matcher = pattern.matcher(test1);
if(matcher.find()){
System.out.println(matcher.group(1)); //Sysouts TWITTERHANDLE
}
matcher = pattern.matcher(test2);
if(matcher.find()){
System.out.println(matcher.group(1)); //Sysouts TWalkBot
}
}
}
关于REGEX的解释
*@(\\w)*推特*
*@
-贪婪模式匹配字符串,直到最后出现@symbol
(\\w)
-创建组1,然后是@symbol,这是我们的目标,寻找长度为1或更多的单词字符*推特*
-查找在第一组之后出现的推文单词,第一组是贪婪的
*
模式再次用于解释组1和推文之间的任何字符,第二个用于推文后的任何尾随字符。
我仍然在考虑Kotlin中的coroutines,但我想知道这是否对我的问题有些矫枉过正,即在返回数据时立即更新文本视图。异常处理使回调变得非常丑陋,我想尽可能避免这些 suspend关键字是否仅仅意味着运行库可能会挂起一个需要一段时间才能完成的函数?还是只在coroutine内启用挂起?作为一个假设,我能写吗 是否知道,如果下载了1 GB的数据,将同时调用,而则等待由填充?
问题内容: 我正在尝试在nodejs REPL的 全局范围内 执行类似的操作。根据我的理解,以下两个陈述均有效。查看文件 但是,这两个语句都引发错误。 有人可以解释为什么吗?我的节点版本是v8.9.4 问题答案: 只能在标记为的函数中使用,因此有两种方法可以实现。 注意: 有一个建议书可能最终允许使用顶级等待呼叫。 第一种方法是创建一个如下所示的自调用函数: 或第二种方法是使用
问题内容: 众所周知,C#提供了一个AS关键字,该关键字会自动执行一次检查,检查对象是否属于某种类型,如果是,则将其强制转换为所需的类型,否则给出null。 在上面的示例中,这里的Object obj可以是User类型或其他类型。用户将获得User类型的对象或null。这是因为C#的As关键字首先执行检查,然后在可能的情况下将对象强制转换为结果类型。 那么Java中有没有与C#的AS关键字等效的关
问题内容: 在下面的源代码中,我抛出一个。 为什么没有必要将关键字放在方法的签名上? 问题答案: 仅在Java 1.7上会出现此现象。使用1.6进行编译时,出现以下编译器错误消息: 但是,使用Java 1.7可以编译。 …直到我实际把一个块扔了进去: 编译中… 看起来Java 1.7足够聪明,可以通过分析块代码来检测可能抛出的类型,而1.6刚看到类型并为此给出了错误。 对其进行更改以使其按预期方式
我正在开发WinForms应用程序,我想使用助记符键。由于Windows参数的原因,您似乎只能在按ALT键(此选项与默认选项类似)后选择在使用应用程序时显示它们。由于这个问题,我意识到了这个选项(顺便说一句,相关但不重复)。 我更改了此选项,并且助记符下划线在开始时正确显示。但我希望避免用户必须打开此选项或按ALT键才能看到带下划线的键。 所以我的问题是:在应用程序中,是否有任何方法可以在不更改设
问题内容: 我是通过不小心遗漏了关键字发现了这一点。通常,以下模块中的方法将声明为,但有趣的是,至少在某些浏览器中,以下工作有效,例如Chrome版本44.0.2403.157 m,但在IE 11.0.9600.17959中失败 这怎么可能在任何浏览器中都运行?这是某种新的ES6功能吗? 问题答案: 这怎么可能在任何浏览器中都运行?是某种新的ES6功能吗? … 方法定义 对象的属性也可以引用函数或