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

时间:2011-11-17 21:58:16

标签: javascript regex

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

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

要匹配的案例:

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

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

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

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

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

4 个答案:

答案 0 :(得分:6)

我认为您正在寻找\b,这意味着“字边界”:

/\buser\b/gi

评论后编辑:

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

/\buser(?=[:;,\s]|$)/gi

不幸的是,你不能对用户名之前的字符进行限制,因为Javascript不支持lookbehinds。但也许这足以满足您的需求?

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

答案 1 :(得分:6)

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

除此之外,你的表达式有几个潜在的错误:字符类(用[]表示)几乎所有字符都处理,包括|,整个交替语法进行第三次交替({{1 ())允许匹配(\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 Let me know if you see user.have you seen user? - 对URL的拒绝应该已经通过要求空格来完成(或在I really like user!之前的字符串的开头 - 之后不允许这样的标点符号将拒绝我认为你想要匹配的一些情况。你可以简单地添加这个额外的标点符号:

user

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

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

我已将所有三条建议放在jsFiddle上,以向您展示您获得的内容,并允许您将自己的一些字符串放入其中。

您喜欢哪种方式,这些表达式将用于find-replace,其中您将在替换表达式中替换用户名之前消耗的空格:

(^|\s)(user\b)

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

答案 2 :(得分:3)

str.replace(
  /(^|\s)(user)(?=[\s:;,]|$)/gi, // look-ahead credits: Code Jockey
  "$1replacement$3"
);

答案 3 :(得分:0)

var input = "user: hi, has anyone seen user, today user";
var username = "user";
var rx = new RegExp("(^|\\s)(" + username + ")([\\s:;,]|$)", "gi");

/* 'user: hi, has anyone seen <a href="…">user</a>, today <a href="…">user</a>' */
var result = input.replace(rx, function (match, paren1, username, paren3) {
  return paren1 + '<a href="…">' + username + '<\/a>' + paren3;
});

(^|\s)(\s|$)而不是\b会阻止前导user:匹配,并且使用非ASCII用户名(\b匹配任何创建的边界字符与[A-Za-z0-9_]不匹配;请参阅ECMAScript Edition 5.1,第15.10.2.6节“断言”。

如果username 变量值包含任何RegExp-special characters,则需要转义username 参数值包含任何URI或(X)HTML特殊字符。例如:

// …
username = username.replace(/[\]\\^$*+?.(){}[]/g, "\\$&");
var rx = new RegExp("(^|\\s)(" + username + ")([\\s:;,]|$)", "gi");

var result = input.replace(rx, function (match, paren1, username, paren3) {
  return (paren1 + '<a href="…/' + encodeURIComponent(username) + '">'
    + username.replace(/&/g, "&amp;").replace(/</g, "&lt;")
    + '<\/a>' + paren3);
});

(另请参阅JSX:regexp.js中的jsx.regexp.escape。)

您可能希望根据您认为的“网址”等来增强此功能。请参阅RFC 3986, Appendix B,以获取与URI匹配的正则表达式。