正则表达式专门匹配 @first.last 格式,之前或之后都没有

我有一个格式为 的字符串some words @first.last more words @first.last。我想编写一个正则表达式来挑选格式中的任何子字符串,@first.last以便我可以用其他内容替换该子字符串。此正则表达式应仅考虑@first.last子字符串并忽略@符号前面的任何字符或last包含该空格后第一个空格之后的任何字符。前任:


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 look at this不会被 str.replace 调用改变


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


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


让我感到困惑的主要事情是在 之前包含什么,(@[a-zA-Z0-9\.\-]+)以确保我只检测到@符号和紧跟在 first.last 格式之后的字符。


我感谢任何帮助和协助。


守着一只汪
浏览 234回答 2
2回答

慕少森

使用像这样的字符类[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+Match @,然后是 1+ 个单词字符、一个点和 1+ 个单词字符(\w你也可以使用[a-zA-Z0-9](?!\S) 断言直接在右侧的不是非空白字符在替换中使用替换后的第一个捕获组 $1Keanu正则表达式演示regex = /(^|\s)@\w+\.\w+(?!\S)/g;str = 'Hey @first.last tell [@first.last] to check this out';str = str.replace(regex, "$1Keanu");console.log(str);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript