我正在尝试匹配字符串中的用户名,如:
"user: hi, has anyone seen user today user"
Run Code Online (Sandbox Code Playgroud)
要匹配的案例:
以下匹配所有情况但返回不需要的空格和字符(我只想替换用户名):
/(^(user)[\s|:|;|,])|(\s(user)[\s|:|;|,]?\s)|(\s(user))/gi
Run Code Online (Sandbox Code Playgroud)
最后我想用链接替换只有用户名.
编辑:请注意,如果用户名是url或其他字符串的一部分,则无法匹配,除非特殊字符尾随它.
我想你正在寻找\b哪个意思是"字边界":
/\buser\b/gi
Run Code Online (Sandbox Code Playgroud)
评论后编辑:
您可以使用前瞻功能轻松地在用户名后添加所需的字符:
/\buser(?=[:;,\s]|$)/gi
Run Code Online (Sandbox Code Playgroud)
不幸的是,你不能对用户名前的字符限制做同样的事情,因为Javascript不支持lookbehinds.但也许这足以满足您的需求?
如果没有,作为一种解决方法,您可以捕获字符串之前必须出现的字符,并将它们替换为自己.
根据您对用户的透明度(或最终目标是什么),您可以考虑要求某人@在用户名前加上符号(例如),以便他们可以选择是否有链接给用户......
除此之外,你的表情有一些潜在的错误:字符类(记[])治疗字面上几乎所有的字符,包括|,整个交替语法使得第三交替((\s(user)))到的东西,将允许匹配userSmith或userJones不只是user-这是一件好事我想你特别想禁止......
我想你要求这样的事情:
(^|\s)(user)(?=[:;,\s]|$)
Run Code Online (Sandbox Code Playgroud)
这分解为:
(^|\s) # either assert that this is the beginning, or capture a whitespace character; capture into back-reference #1
(user) # capture the username 'user' exactly
(?= # look-ahead to verify that the following CAN be matched
[:;,\s] # one character that is : ; , <or whitespace>
| # -OR-
$ # the end of the string
) # end look-ahead
Run Code Online (Sandbox Code Playgroud)
但是,您可能需要考虑一些情况.通过不允许几种标点符号的用户名后,您会排除结果从像字符串:Let me know if you see user.,have you seen user?或者I really like user!-针对URL拒绝应已通过要求的空格(或字符串的开始)前完成了user不允许这样的标点符号之后将拒绝-在某些情况下,我认为你会想要匹配.你可以简单地添加这个额外的标点符号:
(^|\s)(user\b)(?=[;:,.?!)"\s]|$)
Run Code Online (Sandbox Code Playgroud)
但我会建议更像以下内容(删除以下标点符号要求):
(^|\s)(user\b)
Run Code Online (Sandbox Code Playgroud)
我把所有三个建议放在jsFiddle上,向你展示你得到了什么,并允许你把自己的一些字符串放进去.
您喜欢哪种方式,这些表达式将用于find-replace,其中您将在替换表达式中替换用户名之前消耗的空格:
source.replace(/(^|\s)(user\b)/gi, '$1<a href="/linkToProfile?n=$2">$2</a>')
Run Code Online (Sandbox Code Playgroud)
虽然我很确定我回答了这个问题,如果您指定的案例没有被覆盖,请告诉我!
| 归档时间: |
|
| 查看次数: |
336 次 |
| 最近记录: |