我正在尝试匹配字符串中的用户名,如:
"user: hi, has anyone seen user today user"
要匹配的案例:
以下内容符合所有情况,但会返回不需要的空格和字符(我只想替换用户名):
/(^(user)[\s|:|;|,])|(\s(user)[\s|:|;|,]?\s)|(\s(user))/gi
最后,我想用链接替换只有用户名。
编辑:请注意,如果用户名是url或其他字符串的一部分,则无法匹配用户名,除非特殊字符跟踪它的情况除外。
答案 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, "&").replace(/</g, "<")
+ '<\/a>' + paren3);
});
(另请参阅JSX:regexp.js中的jsx.regexp.escape
。)
您可能希望根据您认为的“网址”等来增强此功能。请参阅RFC 3986, Appendix B,以获取与URI匹配的正则表达式。