javascript - 正则表达式 - 检测字符串中所有*分隔的*用户名

标签 javascript regex

我正在尝试检测遵循此形式的所有用户名:

/@[a-zA-Z0-9_.-]{3,30}/

例如,在以下字符串中

@eminem is singing with @rihanna

,该方法必须返回

["@eminem", "@rihanna"]

我尝试过以下方法:

function matchAllUsernames(str) {
  const pattern = /@[a-zA-Z0-9_.-]{3,30}/g;
  return [...str.matchAll(pattern)].flat();
}

const str = "@eminem is singing with @rihanna";

console.log(matchAllUsernames(str));

但是...如果我尝试使用这个字符串会怎样?

@eminem@ndsoiosd is singing with @rihanna

在这种情况下,该方法必须忽略 @eminem 和 @ndsoiosd,因为它们之间没有间隔...

function matchAllUsernames(str) {
  const pattern = /@[a-zA-Z0-9_.-]{3,30}/g;
  return [...str.matchAll(pattern)].flat();
}

const str = "@eminem@ndodshuoc is singing with @rihanna";

console.log(matchAllUsernames(str));

我怎样才能做到这一点?

最佳答案

您可以在 @ 之前为非单词边界添加 anchor ,并在模式末尾的右侧断言空白边界:

\B@[a-zA-Z0-9_.-]{3,30}(?!\S)

Regex demo

function matchAllUsernames(str) {
  const pattern = /\B@[a-zA-Z0-9_.-]{3,30}(?!\S)/g;
  return [...str.matchAll(pattern)].flat();
}

const str = "@eminem@ndodshuoc is singing with @rihanna";

console.log(matchAllUsernames(str));

还支持在下一个 @ 符号之前不允许使用字符 .-:

(?<!\S)@[a-zA-Z0-9_.-]{3,30}(?!\S)

Regex demo

关于javascript - 正则表达式 - 检测字符串中所有*分隔的*用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70903839/

相关文章:

javascript - 调用一次工厂函数

javascript - PDF 预加载的 CORB 问题

.net - 使用正则表达式将字符串映射到功能

regex - 如何列出正则表达式字符类的成员,例如 [ :punct:]?

python - 创建一个正则表达式以删除 python 换行符后的空格

javascript - 将字符串从 Flask 传递到 AngularJS

Javascript nodeValue 返回 null

regex - 对于给定的有限代表字符串列表,正则表达式的语法推理?

regex - Grails:如何从字符串中删除所有HTML标记

javascript - 将 JS 输出存储在 PHP 变量中