我正在寻找一种方法,让一个或多个用户名在字符串中以@
符号开头。
一些示例字符串可能是:
任何解决方案?我找不到任何东西。
提前致谢!
答案 0 :(得分:5)
要匹配单个匹配项,请使用不带任何修饰符的正则表达式,然后使用@
删除.replace("@", "")
:
var myString = "Hey @username this is a test string";
var username = myString.match(/@[a-z0-9_]*/)[0].replace("@", "");
// This will be "username"
对于多次出现,请使用带有g
修饰符的正则表达式匹配多个字符串,然后使用.map()
方法删除每个字符串开头的@
字符使用.replace("@", "")
和.filter()
删除空用户名的用户名:
var myString = "Hey @username1 and @username_two, this is just a test string! @username3";
var usernames = myString.match(/@[a-z0-9_]*/g).map(function(x) { return x.replace("@", ""); }).filter(function(x) { return !!x; });
// This will be ["username1", "username_two", "username3"]
注意:我正在使用正则表达式/@[a-z0-9_]*/g
,因为该用户名只能包含字母,数字和下划线(至少在最常见的网站上,如Twitter等)。
答案 1 :(得分:4)
尝试正则表达式:
var m = "@username This is just a test string".match(/@(.+?)\b/);
console.log(m); // ["@username", "username"]
答案 2 :(得分:1)
其他答案可以正常工作 (主要是) 。我将其添加为匹配多个用户名实例的替代方法:
var str = "random @foo string @bar test @baz";
var usernames = str.split(/@(\w+)/).filter(function(_, i) { return i % 2; });
// [ "foo", "bar", "baz" ]
这是有效的,因为如果在调用.split
时在模式中放置一个捕获组,它将在结果数组中包含该匹配的组。然后你只需要采取所有其他数组元素。
另请注意,ECMAScript 5.1中添加了.filter
,因此旧版浏览器可能不支持此版本。如果这是一个问题,要么使用MDN文章中描述的polyfill技术,要么使用简单的for
循环。
答案 3 :(得分:-2)
只是做:
var user = "@username";
var user2 = user.split("@")[1];