2013-09-18 2 views
3

Я пытаюсь найти регулярное выражение, которое будет соответствовать строке, когда ей НЕ предшествует другая конкретная строка (в моем случае, когда ей НЕ предшествует «http : // "). Это находится в JavaScript, и я работаю на Chrome (не то, чтобы это было важно).Регулярное выражение - строка совпадения, не предшествующая другой строкой (JavaScript)

Образец кода:

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

И я хочу, чтобы заменить что-то с регулярным выражением, которое означает «соответствовать www.stackoverflow.com, если это не предшествует HTTP: //». Предупреждение должно тогда сказать «http://www.stackoverflow.com камней», естественно.

Может ли кто-нибудь помочь? Кажется, я пробовал все, что было найдено в предыдущих ответах, но ничего не работает. Благодаря!

+1

Читайте о "негативных взглядах". – elclanrs

+0

Технически, всей этой строке не предшествует 'http: //'; следует ли его заменить в целом? – raina77ow

+0

Uncaught SyntaxError: Неверное регулярное выражение: /(?

ответ

4

Поскольку 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 Fiddle.

+0

Это хорошее предложение. Спасибо! –

0

Это также работает:

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 камни".

+1

Это работает, но не так, как вы думаете В основном, поскольку используется оператор регулярного выражения символьного класса, вы просто заменяете последовательность любого символа, который не находится в диапазоне «htps: /() |», а затем «www.example.com». у вас много ложных срабатываний, во-первых, и это просто избыточно, во-вторых. – raina77ow

Смежные вопросы