正则表达式获取字符和空格之间的字符串并排除第一个分隔符

时间:2015-11-09 21:36:59

标签: javascript regex

在下文中,正则表达式(Javascript)匹配"用户" (用户是随机名称),不包括" @"字符?

I want to tag this @user here
and this @user
@user


我查看了以下解决方案并制作了以下不起作用的正则表达式

RegEx pattern to match a string between two characters, but exclude the characters

\@(.*)\s

Regular Expression to find a string included between two characters while EXCLUDING the delimiters

(?!\@)(.*?)(?=\s)

Regex: Matching a character and excluding it from the results?

^@[^\s]+

最后,我使这个正则表达式有效,但返回" @ user"而不是"用户":

@[^\s\n]+

用于执行正则表达式的Javascript是:

string.match(/@[^\s\n]+/)

2 个答案:

答案 0 :(得分:1)

我发现我需要发表澄清。

如果事先在JS中知道一个模式,即如果你没有从单独的变量构建一个正则表达式,那么应该使用RegExp literal notation(例如/<pattern>/<flag(s)>)。

在这种情况下,您需要一个捕获组来从匹配开始的@获取子匹配,然后继续下一个非空白字符。如果在一个输入字符串中有多个值,则不能使用String#match,因为使用该方法的全局正则表达式会丢失捕获的文本。您需要使用RegExp#exec

var s = "I want to tag this @user here\nand this @user\n@user";
var arr = [];
var re = /@(\S+)\b/g;
while ((m=re.exec(s)) !== null) {
  arr.push(m[1]);  
}
document.write(JSON.stringify(arr));

我建议的正则表达式是@(\S+)\b

  • @ - 匹配文字@
  • (\S+) - 匹配并捕获到第1组一个或多个以
  • 结尾的非空白字符
  • \b - 字边界(如果名称中包含Unicode字母,则删除。)

答案 1 :(得分:0)

如果以这种方式执行,它应该可以工作:

var str = "I want to tag this @user here";
var patt = new RegExp("@([^\\s\\n]+)");
var result = patt.exec(str)[1];