Если поддерживается lookbehind, вы можете использовать
/(?<!:(?=string:))string/i
См. Демоверсию regex
Подробности
(?<!:(?=string:))
- отрицательный взгляд сзади, который не соответствует совпадению, если непосредственно слева от текущего местоположения есть :
, за которым сразу не следует string:
string
- a string
var strs = ['string - gets deleted','blah string - gets deleted',':string blah - gets deleted',':string: string - gets deleted','thing :string: - doesnt get deleted'];
var rx = /(?<!:(?=string:))string/i;
for (var s of strs) {
console.log(s, "=>", rx.test(s));
}
Вывод:
string - gets deleted => true
blah string - gets deleted => true
:string blah - gets deleted => true
:string: string - gets deleted => true
thing :string: - doesnt get deleted => false
Версия без заглядывания назад
Она основана на регулярном выражении, которое соответствуетstring
или без двоеточий или с двоеточиями с обеих сторон.Если совпадения содержат хотя бы одно совпадение без двоеточия в начале, запись должна быть удалена.
var strs = ['string - gets deleted','blah string - gets deleted',':string blah - gets deleted',':string: string - gets deleted','thing :string: - doesnt get deleted'];
var rx = /(?::(?=string:))?string/gi;
for (var s of strs) {
var matches = s.match(rx);
console.log(s, "=>", (matches.some(function (x) { return !/^:/.test(x); }) ));
}