为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

守着一只汪 2021-07-13 17:57:20
我有一个格式为 的字符串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 格式之后的字符。我感谢任何帮助和协助。
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

使用像这样的字符类[a-zA-Z0-9.-]+有点广泛匹配,因为它不能保证例如点不在末尾。它可以匹配任何列出的,因此例如--.--也是有效的。请注意,您不必转义点,也不必转义破折号(如果它在末尾)。

  1. 一个模式 (@[a-zA-Z0-9\.\-]+)匹配两者,因为左侧和右侧没有设置边界。

  2. 所述第二图案 [^\[](@[a-zA-Z0-9\.\-]+)包括作为前导空间匹配由否定的字符类匹配[^\[]该匹配不是[

  3. 第三模式 [^\[\s](@[a-zA-Z0-9\.\-]+) 不匹配,因为现在是否定的字符类[^\[\s]不允许匹配前导空格。

  4. 第四图案 [^.+?](@[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);


查看完整回答
反对 回复 2021-07-15
  • 2 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信