簡體   English   中英

正則表達式:如果foo是單詞或URL內,則替換foo

[英]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);

OUTPUT:

bar myfoo http://thebarbar.com/bard is awesome

現場演示: http//ideone.com/8xGy2h

我認為你將不得不多做一步才能做到這一點。 基本上你在這里做兩個獨立的(盡管是類似的)正則表達式替換:

  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 replace”來創建新數組
  3. 循環遍歷原始匹配數組,並將這些匹配作為模式替換為第二個數組中的更新值

循環遍歷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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM