Javascript 正则表达式要特别匹配@first.last格式,前后无任何内容

Javascript 正则表达式要特别匹配@first.last格式,前后无任何内容,javascript,regex,Javascript,Regex,我有一个字符串,格式为一些单词@first.last更多单词@first.last。我想编写一个正则表达式来选择格式为@first.last的任何子字符串,这样我就可以用其他内容替换该子字符串。这个正则表达式应该只考虑 @第一个。最后< /COD>子串,忽略在 @ 符号之前的任何字符,或在代码>最后代码>第一空间之后的任何东西,包括该空间。例: regex = new RegExp(/[^\[\s](@[a-zA-Z0-9\.\-]+)/im); str = 'Hey @first.last t

我有一个字符串,格式为
一些单词@first.last更多单词@first.last
。我想编写一个正则表达式来选择格式为
@first.last
的任何子字符串,这样我就可以用其他内容替换该子字符串。这个正则表达式应该只考虑<代码> @第一个。最后< /COD>子串,忽略在<代码> @ <代码>符号之前的任何字符,或在代码>最后<空间>代码>第一空间之后的任何东西,包括该空间。例:

regex = new RegExp(/[^\[\s](@[a-zA-Z0-9\.\-]+)/im);
str = 'Hey @first.last tell [@first.last] to check this out';
str = str.replace(regex, 'Keanu');
/** str: 'Hey Keanu tell [@first.last] to check this out? **?
我尝试过的正则表达式:

  • (@[a-zA-Z0-9\.\-]+)
    ->将为我提供部分帮助,但不会删除
    @
    符号前面的字符

  • [^\[](@[a-zA-Z0-9\.\-]+)
    ->如果
    @first.last
    是字符串的第一个子字符串,则此正则表达式将失败,即
    @first.last查看此
    不会被str.replace调用更改

  • [^\[\s](@[a-zA-Z0-9\.\-]+)
    ->尝试过滤前导空格

  • [^.+?](@[a-zA-Z0-9\.\-]+)

让我大吃一惊的主要事情是在
(@[a-zA-Z0-9\.\-]+)
之前包含什么,以确保我只检测到
@
符号以及紧跟其后的第一个最后一个格式的字符


非常感谢您的帮助。

使用
[a-zA-Z0-9.]+
是一种广泛的匹配,因为它不能保证点不在末尾。它可以匹配列出的任何一个,因此,例如
-->也是有效的。请注意,如果点在末尾,则不必转义点,也不必转义破折号

  • (@[a-zA-Z0-9\.\-]+)
    两者都匹配,因为在左侧和右侧没有设置边界

  • [^\[](@[a-zA-Z0-9\.\-]+)
    匹配包括前导空格,因为该前导空格由与非
    [
    匹配的否定字符类
    [^\[]
    匹配

  • [^\[\s](@[a-zA-Z0-9\.\-]+)
    不匹配,因为现在被求反的字符类
    [^\[\s]
    不允许匹配前导空格

  • [^.+?](@[a-zA-Z0-9\.\-]+)
    与前面的
    [
    匹配,因为前面的
    [^.+?]
    不匹配

  • 您可以使用一个捕获组,该组可以匹配字符串的开头或空格字符,然后将@部分与单词字符和点匹配:

    (^|\s)@\w+\.\w+(?!\S)
    
    解释

    • (^ |\s)
      捕获组1,字符串或空格字符的开头
    • @\w+\.\w+
      匹配
      @
      ,然后是1+字字符、一个点和1+字字符(代替
      \w
      ,您也可以使用
      [a-zA-Z0-9]
    • (?!\S)
      断言右边的字符不是非空白字符
    在替换中,使用第一个捕获组,然后是替换
    $1Keanu

    regex=/(^ |\s)@\w+\.\w+(?!\s)/g;
    str='Hey@first.last告诉[@first.last]检查这个';
    str=str.replace(regex,“$1Keanu”);
    
    console.log(str);
    我猜这个表达式可能在这里也适用

    (\s+|^)(@[a-z0-9-]+\.[a-z0-9-]+)(\s+|$)
    
    \s+
    是增加空格的一种以防万一的方法,如果愿意,我们只需修改char类即可

    const regex=/(\s++^)(@[a-z0-9-]+\.[a-z0-9-]+)(\s++$)/gis;
    const str=`一些单词@first.last更多单词@first.last
    一些单词@first.last更多单词@first.last012其他一些文本
    一些单词@first.last更多单词@first.last012\$%^&
    一些words@first.last更多words@first.last`;
    常量subst=`1Keanu$3`;
    const result=str.replace(regex,subst);
    
    console.log(result);
    你的意思是这样吗?
    (^ |\s)@\w+.\w+(?!\s)
    你列出的第一个模式很好,这些可视化可能对那些已经可以编写(基本)正则表达式的人没有太大帮助。这非常有效。它还教会了我以前没有意识到的环顾四周的方法。谢谢!