javascript - 用正则表达式在 Javascript 中用链接替换用户名

标签 javascript regex

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

"user: hi, has anyone seen user today user"

要匹配的案例:

  • substring 是第一个单词尾随一个空格,中间被空格包围或者最后一个单词前导一个空格
  • 允许跟在单词后面但不作为结果返回的字符:“:;,”

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

/(^(user)[\s|:|;|,])|(\s(user)[\s|:|;|,]?\s)|(\s(user))/gi

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

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

最佳答案

根据您希望它对用户的透明程度(或您的最终目标是什么),您可以考虑要求某人在用户名前放置一个符号(例如 @),因此他们可以选择是否链接到用户...

除此之外,您的表达式还有几个潜在的错误:字符类(由 [] 表示)按字面意思对待几乎所有字符,包括 |,整个交替语法使得第三个交替 ((\s(user))) 将允许匹配 userSmithuserJones 而不仅仅是 user - 这是我认为你特别想要禁止的东西......

我想你是在要求这样的东西:

(^|\s)(user)(?=[:;,\s]|$)

这分解为:

(^|\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

但是,您可能需要考虑一些情况。通过不允许在用户名后使用多种标点符号,您将从以下字符串中排除结果:如果您看到用户,请告诉我。您看到用户了吗?我真的很喜欢用户! - URL 的拒绝应该已经通过在 user 之前要求空格(或字符串的开头)来完成 - 之后不允许这样的标点符号将拒绝某些情况我认为你会想要匹配。您可以简单地添加这个额外的标点符号:

(^|\s)(user\b)(?=[;:,.?!)"\s]|$)

但我建议更像以下内容(删除以下标点符号要求):

(^|\s)(user\b)

我已将所有三个建议放在 jsFiddle 上, 向您展示您得到了什么,并允许您放入一些您自己的字符串。

无论您喜欢哪种方式,这些表达式都可以在查找替换中使用,您可以在替换表达式中用自己替换用户名之前消耗的空格:

source.replace(/(^|\s)(user\b)/gi, '$1<a href="/linkToProfile?n=$2">$2</a>')

虽然我很确定我已经回答了问题,但如果您指定的某些情况未涵盖,请告诉我!

关于javascript - 用正则表达式在 Javascript 中用链接替换用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174950/

相关文章:

java -\G 在 PCRE 后视中如何工作

sql - 匹配所有数字直到第一个空格

regex - 正则表达式匹配模式一次或多次,没有部分匹配

Javascript:仅当找到标签时才剥离标签

java - Javascript和Java进行相同的验证

javascript - 如何进一步优化 javascript 表行的创建/插入?

java - Java 真的如其声称的那样转义了反斜杠吗?

javascript - 如何在护照js中添加登录错误提示信息

javascript - 数组内的链接或 window.location 的不同链接

regex - awk/sed/grep/perl 使用字段分隔符然后仅显示特定行