如何在@符号之后和空格之前获取用户输入?

时间:2017-01-30 00:24:07

标签: javascript string

我想从输入标记中获取用户输入,包括@符号后的所有内容,如果空格存在,则最多为空格。例如:

如果用户输入为“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;
}

4 个答案:

答案 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)

&#13;
&#13;
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;
&#13;
&#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等人中。有效地说,从第一个位置开始,给我每个字符直到字符串的末尾。