我需要在评论中找到所有用户提及。这意味着我需要找到正则表达式1)
的所有匹配项,其中@
之后不超过一个点和下划线。
这是可用于查找所有可能提及的正则表达式:
1)\B(@[a-z_.]{3,24})
我想确保@
之后的符号是有效的用户名(无需检查用户是否存在于数据库中)
我正在使用此正则表达式来验证用户名:
2)'^(?!(.*?\_){2})(?!(.*?\.){2})[a-z0-9\._]{3,24}$'
它检查用户名是否包含3-24个符号,是否包含0-1点和下划线。
由于negative lookahead
我尝试结合使用正则表达式1)
和2)
,但是效果不佳。
还可以使用正则表达式1)
,对于每个匹配项,都可以使用正则表达式2)
。我不喜欢它,因为它在长评论中会非常缓慢...
更新: 例如,我有一条评论
'text @valid_username text @unvalid_username_ text @valid.username text @unvalid..username'
我只需要提及用户名由3到24个符号组成且不超过一个点和下划线的提及
答案 0 :(得分:1)
您可能会考虑使用像
这样的适当模式let teamLogo = Team.get()
let teamImage = team?.teamLogo
guard let image = teamImage else {return nil}
let teamImageAttachment = AsyncTextAttachment()
teamImageAttachment.imageURL = URL(string: image)
let stringWithTeamImage = NSAttributedString(attachment: teamImageAttachment)
let finalAttributedString = NSMutableAttributedString(string: "")
finalAttributedString.append(stringWithTeamImage)
请参见regex demo。该模式的唯一缺点是,如果有效提及可以以r'\B@(?!(?:[a-z0-9.]*_){2})(?!(?:[a-z0-9_]*\.){2})[._a-z0-9]{3,24}\b'
结尾,它将与该.
匹配(请参见demo)。
详细信息
.
-一个\B@
之前没有单词char @
-(?!(?:[a-z0-9.]*_){2})
之后的任何地方都没有两个_
字符@
-(?!(?:[a-z0-9_]*\.){2})
之后的任何地方都没有两个.
字符@
-三到二十四个字母,数字,[._a-z0-9]{3,24}
和.
_
-单词边界请注意,您实际上可以使用some Python code来过滤通过\b
获得的结果:
\B(@[a-z_.]{3,24})