4

鉴于这种:

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.

有什么帮助吗?

4

3 回答 3

5

您可以使用此代码(适用于您的示例,但尚未尝试使用更复杂的输入):

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

现场演示:http: //ideone.com/8xGy2h

于 2013-03-12T20:51:10.707 回答
0

我认为您将不得不采取多步骤才能正确完成这项工作。基本上你在这里做了两个单独的(尽管相似的)正则表达式替换:

  1. 字符组“foo”的全局替换,如果它出现在链接中,并且
  2. 字符串其余部分中单词“foo”的全局替换。

此代码将分别运行这两个步骤(首先是 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 的可能性会更复杂一些:

  1. var urlString = str.match(urlPattern)使用数组捕获所有 URL
  2. 通过遍历每个 URL 并在每个 URL 上执行单独的“foo 替换”来创建一个新数组
  3. 循环遍历原始匹配数组并将其用作要被第二个数组中的更新值替换的模式

循环遍历由返回的所有 URL var urlString = str.match(urlPattern),分别替换其中的“foo”,然后再次循环遍历,然后一次替换一个原始字符串。

于 2013-03-12T20:44:14.597 回答
-1

如果您想使用边界仅匹配“foo”而不匹配“myfoo”,则需要使用 or 操作 ( |) 来匹配 url——如果“foo”包含在 url 的中间,则必要时,它不会被单词边界包围。

像这样的东西应该适合你:

\b(foo)\b | http\S*(foo)\S*

如果需要,您可以在此处运行进一步的测试。


编辑:抱歉,我认为 OP 正在寻求捕获这些单词和 URL。据我所知,不会捕获 URL 的根以进行替换的后向正则表达式在 JS 中并不天生支持,但可以经常使用简单的函数进行复制,请参阅此处了解如何执行此操作的讨论

于 2013-03-12T19:48:21.973 回答