我想从输入标记中获取用户输入,包括@符号后的所有内容,如果空格存在,则最多为空格。例如:
如果用户输入为“hello @ yourname”
我想抓住“你的名字”
如果用户输入是“hello @ yourname hisname”
我想抓住“你的名字”,因为它在@符号后面并在空格处结束。
我编写了一些代码,试图根据这些规则获取用户输入,但是存在一个我无法弄清楚如何修复的错误。现在,如果我输入“hello @ yourname hisname”
我的代码将返回“yourname hisn”
我不知道为什么空间和四个字符“hisn”被归还。请帮我弄清楚bug的位置。
这是我执行用户输入提取的函数。
handleSearch(event) {
let rawName, nameToSearch;
rawName = event.target.value.toLowerCase();
if (rawName.indexOf('@') >= 0 && rawName.indexOf(' ') >= 0) {
nameToSearch = rawName.substr(rawName.indexOf('@') + 1, rawName.indexOf(' ') - 1);
} else if (rawName.indexOf('@') >= 0 && rawName.indexOf(' ') < 0) {
nameToSearch = rawName.substr(rawName.indexOf('@') + 1);
} else {
nameToSearch = '';
}
return nameToSearch;
}
答案 0 :(得分:1)
工作示例:
handleSearch(event) {
let rawName = event.target.value.toLowerCase();
if (rawName.indexOf("@") === -1) {
return '';
}
return (rawName.split("@")[1].split(" "))[0];
}
你必须处理缺少“@”,但你不需要处理“@”之后有空格的情况。在这两种情况下,拆分功能仍然可以正常运行。
编辑:OP的代码不起作用的具体原因是因为substr方法的第二个参数不是结束索引,而是在起始索引之后返回的字符数。您可以使用类似的SUBSTRING方法而不是SUBSTR来简化这一过程。更改第一个if语句后面的行,如下所示:
nameToSearch = rawName.substring(rawName.indexOf('@') + 1, rawName.indexOf(' '));
答案 1 :(得分:0)
你可以这样做 -
var string = "me@somename yourname";
var parts = string.split("@");
var parts2 = parts[1];
var yourPart = parts2.split(" ");
console.log(yourPart[0]);
注意:强> 我建议只是因为你知道你的字符串结构。
<强>建议强>
对于你的代码片段,我认为你在hisn
之后有一些空格,这就是它返回此输出的原因。如果在hisn
之后获得任何空格,请尝试将所有空格替换为某些字符。
答案 2 :(得分:0)
const testCases = [
"hello@yourname",
"hello@yourname hisname"
];
for (let test of testCases) {
let re = /@(.*?)(?:\s|$)/g;
let result = re.exec(test);
console.log(result[1]);
}
&#13;
如果您知道如何创建字符串,请使用正则表达式。
答案 3 :(得分:0)
我不确定您的代码所使用的语言(有几种可能是&#39;可能是Javascript),但在大多数语言(包括Javascript)中都是子字符串函数&#39 ;从&#39;开始第一个参数的位置,然后&#39;结束于&#39;该位置加上第二个参数。因此,当您的第二个参数是第一个空格的位置 - 1&#39;时,您可以替换第一个空格的位置 - 1&#39;因此,您通过在第一个@字符的位置(即基于零的系统中的位置6)之后启动一个子字符串来获得子字符串。然后给我接下来的13个字符。&#39;
换句话说,你似乎试图说“给我位置6和位置12(包括)之间的角色”,但是你真的在说“给我”位置6和位置18(包括)之间的字符&#39;。
这是
你好吗?
1 2 3 4 5 6 7 8 9 10 11 12 13
(出于某种原因,我无法在这个答案中保留我的空格和换行符;但如果你算上你的名字中的字母,那就应该有意义:))
这就是为什么你可以使用Neophyte的代码,只要你可以设定字符串是什么。为了扩展Neophyte的答案,这里是我将使用的代码(在条件的真正分支中 - 您也可以根据此逻辑重命名变量等):
nameToSearch = rawName.substr(rawName.indexOf(&#39; @&#39;)+ 1;
var nameFromNameToSearch = nameToSearch.substr(nameToSearch.indexof(&#39;&#39;) - 1;
nameFromNameToSearch将包含您要查找的字符串。我还没有完全测试过这段代码,但我希望它能够在概念上和#39;为您提供您正在寻找的答案。另外,从概念上来说,无论是否有多个&#39; @&#39;它都应该有效。标志等。
P.S。在第一个&#39; rawName.substr&#39;我没有给出第二个参数,在Javascript等人中。有效地说,从第一个位置开始,给我每个字符直到字符串的末尾。