[英]Regex: Replace foo if it's a word or inside a URL
鉴于这种:
str = "foo myfoo http://thefoobar.com/food is awesome";
str.replace(magicalRegex, 'bar');
预期的结果是:
"bar myfoo http://thebarbar.com/bard is awesome"
我得到\\b(foo)\\b
部分,但我无法弄清楚如何在网址中匹配和捕获foo
。 出于这些目的,假设网址始终以http
开头。
有帮助吗?
您可以使用此代码(适用于您的示例但未尝试使用更复杂的输入):
str = 'foo myfoo http://thefoobar.com/food is awesome';
str = str.replace(/\bfoo\b/g, 'bar');
while (/http:\/\/[^\s]*?foo/.test(str))
str = str.replace(/(http:\/\/[^\s]*?)?foo/g, function($0, $1) {
return $1 ? $1 + 'bar' : $0;
});
console.log(str);
bar myfoo http://thebarbar.com/bard is awesome
我认为你将不得不多做一步才能做到这一点。 基本上你在这里做两个独立的(尽管是类似的)正则表达式替换:
此代码将分别执行两个步骤(URL首先,其余字符串秒)并给出最终替换:
var urlPattern = /(http:\/\/[^\s]+)/;
var urlFooPattern = /(foo)/g;
var globalFooPattern = /\b(foo)\b/g;
var str = "foo myfoo http://thefoobar.com/food is awesome";
var urlString = str.match(urlPattern)[0];
urlString = urlString.replace(urlFooPattern, "bar");
str = str.replace(urlPattern, urlString);
str = str.replace(globalFooPattern, "bar");
注意:这假定字符串中只有一个URL。 。 。 处理多个URL的可能性会更复杂一些:
var urlString = str.match(urlPattern)
捕获所有URL 循环遍历var urlString = str.match(urlPattern)
返回的所有URL,单独替换它们中的“foo”,然后再次循环,然后一次一个地替换原始字符串中的它们。
如果你想使用边界只匹配“foo”但不匹配“myfoo”,你需要使用或操作( |
)匹配网址 - 必要时,如果“foo”包含在中间url,它不会被字边界包围。
这样的事情对你有用:
\b(foo)\b | http\S*(foo)\S*
如果需要,您可以在此处运行进一步测试
编辑:道歉,我认为OP正在寻找捕获这些词和URL。 据我所知,JS中并不支持不会捕获URL替换URL的后备正则表达式,但可以通过简单的函数进行复制, 请参阅此处以了解如何执行此操作 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.