5

我使用一个系统来获取@twitter 之类的名称,并且以下正则表达式接近完美:

(?<![^\s<>])@([^\s<>]+)

我发现的问题是名称后面是否有标点符号

例如:

  • 嘿 @mark ===> 匹配 @mark (这就是我们想要的)
  • 嘿@mark。===> 匹配@mark。
  • 嘿@mark,你很好===>匹配@mark,
  • 嘿@马克!!!!我没想到 ===> 匹配 @mark !!!

显然我们只想匹配用户名而不是标点符号。需要注意的是,某些用户名在用户名中包含这些句点,例如

例如,这些都是合法的用户名

标记.markus

马克@gmail.com

mark_markus@gmail.com

编辑 我们正在使用后视,如果上面的用户名与前面的@一起使用,它们应该匹配,但如果没有前面的@,那么电子邮件地址实际上不应该匹配。@mark_markus@gmail.com 应该匹配 mark_markus@gmail.com,但如果有人输入普通的旧 mark_markus@gmail.com,我们不希望 gmail.com 匹配。

关于如何修改正则表达式以解释可以使用的各种标点符号的任何想法?

4

1 回答 1

4

这个怎么样:

(?<![\w@])@([\w@]+(?:[.!][\w@]+)*)

我已替换[^\s<>][\w@]限制性更强的 。 \w匹配字母、数字和下划线。如果您特别需要允许任何其他字符,请将它们添加到每个字符类中。

此组:(?:\.\w+)*允许一个或多个句点作为用户名的一部分,但前提是它们后面紧跟单词字符。请注意,这(?:...)是一个非捕获组。当您想出于逻辑目的对事物进行分组但不需要捕获结果时,它很有用。

更新: 查看一个工作示例

于 2013-03-15T15:31:21.857 回答