簡體   English   中英

正則表達式 - 匹配字符串前面沒有另一個字符串 (JavaScript)

[英]Regular Expression - Match String Not Preceded by Another String (JavaScript)

我試圖找到一個正則表達式,當它前面沒有另一個特定字符串時(在我的例子中,當它前面沒有“http://”時)將匹配一個字符串。 這是在JavaScript中,我在 Chrome 上運行(沒關系)。

示例代碼是:

var str = 'http://www.stackoverflow.com www.stackoverflow.com';
alert(str.replace(new RegExp('SOMETHING','g'),'rocks'));

我想用一個正則表達式替換 SOMETHING,意思是“匹配 www.stackoverflow.com,除非它前面有 http://”。 然后警報自然會說“ http://www.stackoverflow.com Rocks”。

任何人都可以幫忙嗎? 感覺就像我嘗試了以前答案中的所有內容,但沒有任何效果。 謝謝!

由於JavaScript正則表達式引擎不支持“lookbehind”斷言,因此無法使用普通正則表達式。 仍然有一個解決方法,涉及replace回調函數:

var str = "As http://JavaScript regex engines don't support `lookbehind`, it's not possible to do with plain regex. Still, there's a workaround";

var adjusted = str.replace(/\S+/g, function(match) {
  return match.slice(0, 7) === 'http://'
    ? match
    : 'rocks'
});
console.log(adjusted);

您實際上可以為這些函數創建一個生成器:

var replaceIfNotPrecededBy = function(notPrecededBy, replacement) {
   return function(match) {
     return match.slice(0, notPrecededBy.length) === notPrecededBy
       ? match
       : replacement;
   }
};

...然后在replace使用它:

var adjusted = str.replace(/\S+/g, replaceIfNotPrecededBy('http://', 'rocks'));

JS小提琴

這也有效:

var variable = 'http://www.example.com www.example.com';
alert(variable.replace(new RegExp('([^(http:\/\/)|(https:\/\/)])(www.example.com)','g'),'$1rocks'));

警報說“ http://www.example.com rocks”。

Raina77ow 的回答反映了 2013 年的情況,但現在已經過時了,因為關於后向斷言的提議<\/a>在 2018 年被 ECMAScript 規范接受。<\/strong>

請參閱MDN 上的文檔<\/a>:

人物<\/th> 意義<\/th><\/tr><\/thead>
(?<!y)x<\/code><\/td> 否定后向斷言:<\/strong>僅當“x”前面沒有“y”時才匹配“x”。 例如, \/(?<!-)\\d+\/<\/code>僅匹配前面沒有減號的數字。 \/(?<!-)\\d+\/.exec('3')<\/code>匹配“3”。 \/(?<!-)\\d+\/.exec('-3')<\/code>匹配未找到,因為數字前面有減號。<\/td><\/tr><\/tbody><\/table><\/blockquote>

因此,您現在可以將“匹配www.stackoverflow.com<\/code>除非它前面有http:\/\/<\/code> ”表示為\/(?<!http:\\\/\\\/)www.stackoverflow.com\/<\/code> :

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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