我正在尝试匹配字符串中的用户名,例如:
"user: hi, has anyone seen user today user"
要匹配的案例:
- substring 是第一个单词尾随一个空格,中间被空格包围或者最后一个单词前导一个空格
- 允许跟在单词后面但不作为结果返回的字符:“:;,”
以下匹配所有情况但返回不需要的空格和字符(我只想替换用户名):
/(^(user)[\s|:|;|,])|(\s(user)[\s|:|;|,]?\s)|(\s(user))/gi
最后我只想用链接替换用户名。
编辑:请注意,如果用户名是 url 或其他字符串的一部分,则无法匹配,除非特殊字符尾随它。
最佳答案
根据您希望它对用户的透明程度(或您的最终目标是什么),您可以考虑要求某人在用户名前放置一个符号(例如 @
),因此他们可以选择是否链接到用户...
除此之外,您的表达式还有几个潜在的错误:字符类(由 []
表示)按字面意思对待几乎所有字符,包括 |
,整个交替语法使得第三个交替 ((\s(user))
) 将允许匹配 userSmith
或 userJones
而不仅仅是 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/