用正则表达式替换Javascript中的链接的用户名

jor*_*llo 5 javascript regex

我正在尝试匹配字符串中的用户名,如:

"user: hi, has anyone seen user today user"
Run Code Online (Sandbox Code Playgroud)

要匹配的案例:

  • substring是尾随空格的第一个单词,中间由空格或最后一个空格包围
  • 允许跟随字符跟踪单词但不返回结果:":;"

以下匹配所有情况但返回不需要的空格和字符(我只想替换用户名):

/(^(user)[\s|:|;|,])|(\s(user)[\s|:|;|,]?\s)|(\s(user))/gi
Run Code Online (Sandbox Code Playgroud)

最后我想用链接替换只有用户名.

编辑:请注意,如果用户名是url或其他字符串的一部分,则无法匹配,除非特殊字符尾随它.

Mar*_*ers 6

我想你正在寻找\b哪个意思是"字边界":

/\buser\b/gi
Run Code Online (Sandbox Code Playgroud)

评论后编辑:

您可以使用前瞻功能轻松地在用户名后添加所需的字符:

/\buser(?=[:;,\s]|$)/gi
Run Code Online (Sandbox Code Playgroud)

不幸的是,你不能对用户名前的字符限制做同样的事情,因为Javascript不支持lookbehinds.但也许这足以满足您的需求?

如果没有,作为一种解决方法,您可以捕获字符串之前必须出现的字符,并将它们替换为自己.


Cod*_*key 6

根据您对用户的透明度(或最终目标是什么),您可以考虑要求某人@在用户名前加上符号(例如),以便他们可以选择是否有链接给用户......

除此之外,你的表情有一些潜在的错误:字符类(记[])治疗字面上几乎所有的字符,包括|,整个交替语法使得第三交替((\s(user)))到的东西,将允许匹配userSmithuserJones不只是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)

虽然我很确定我回答了这个问题,如果您指定的案例没有被覆盖,请告诉我!