【问题标题】:Regex to get the string between a character and a whitespace and excluding the first delimiter正则表达式获取字符和空格之间的字符串并排除第一个分隔符
【发布时间】:2026-01-14 08:25:02
【问题描述】:

在下面的文本中,什么正则表达式(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”而不是“user”的正则表达式:

@[^\s\n]+

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

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

【问题讨论】:

  • 你如何调用正则表达式?这就是问题所在。
  • 似乎至少部分地,问题不仅在于正则表达式,还在于您如何在代码中使用它。您提到的最后一个表达式应该可以匹配用户名但不能提取它。要提取它,您需要形成一个带括号的捕获组,例如@([^\s\n]+)
  • 发布您的确切 JavaScript。

标签: javascript regex


【解决方案1】:

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

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

【讨论】:

  • 这个答案是错误的。输出为u。您需要小心 RegExp 构造函数中的 \
  • 拜托,这甚至不可能。当人们在设计时知道模式时,应该使用文字表示法,这样就不容易出错。 SO上有很多这样的问题,询问为什么单斜杠不起作用。使用var patt = /@(\S+)/;
【解决方案2】:

我知道我需要澄清一下。

如果您事先知道 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 字母,则删除)。

【讨论】:

    最近更新 更多