[英]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.