鉴于这种:
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
从一个 url 中匹配和捕获。出于这些目的,假设 url 总是以http
.
有什么帮助吗?
鉴于这种:
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
从一个 url 中匹配和捕获。出于这些目的,假设 url 总是以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循环遍历由返回的所有 URL var urlString = str.match(urlPattern)
,分别替换其中的“foo”,然后再次循环遍历,然后一次替换一个原始字符串。
如果您想使用边界仅匹配“foo”而不匹配“myfoo”,则需要使用 or 操作 ( |
) 来匹配 url——如果“foo”包含在 url 的中间,则必要时,它不会被单词边界包围。
像这样的东西应该适合你:
\b(foo)\b | http\S*(foo)\S*
如果需要,您可以在此处运行进一步的测试。
编辑:抱歉,我认为 OP 正在寻求捕获这些单词和 URL。据我所知,不会捕获 URL 的根以进行替换的后向正则表达式在 JS 中并不天生支持,但可以经常使用简单的函数进行复制,请参阅此处了解如何执行此操作的讨论。