我想在一个句子中检测@username。为此,我使用了一个简单的/\B@([\w]+)/ig
。这很好用但是当用户名包含一个fullstop时会中断。例如,@user.name
。那么检测@username的最佳正则表达式是什么,其中用户名可以包含a-z
,A-Z
,0-9
和.
。
测试句1:Find @david in the database.
此处正则表达式应与david
测试句子2:Find @david.name in the database.
此处正则表达式应与david.name
测试句子3:Find who is @david. And tell him something.
此处的正则表达式应与david
相匹配,而不是david.
答案 0 :(得分:3)
这样做:
/\B@([a-zA-Z0-9.]*[a-zA-Z0-9])/g
它允许用户名中的点,但不是它的最后一个字符。
答案 1 :(得分:3)
您可以使用这个简单的正则表达式:
/\B@\b([\w.]+)\b/g
我使用了\w
因为您在正则表达式中使用了它。如果你不想要下划线,那么你可以这样做:
/\B@\b([a-z\d.]+)\b/gi
答案 2 :(得分:0)
这适用于您的用例,不确定它是否会最终实现您想要的一切:
\B@((?:\w|\.(?=\S))+)
我试图保持逻辑与你的逻辑基本相同,所以基本上我们匹配\B@
然后捕获\w+
。但是,您也希望能够匹配.
,只要它不是句子的结尾(后跟空格)。所以我将\w
置于非捕获组中并使用替换(|
)以允许\.
如果后跟非空白字符((?=\S)
})。然后我们重复这个非捕获组并捕获整个事物。