Соответствует строке, если не начинается и не заканчивается символом - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь использовать регулярное выражение в JavaScript, чтобы решить, удаляется ли сообщение.Я хочу удалить сообщение, если оно содержит «строку» в любом месте, если оно не окружено двоеточиями.

  • string - удаляется
  • blah string - удаляется
  • :string blah - удаляется
  • :string: string - удаляется
  • thing :string: - не удаляется

Я использую JavaScript, и до сих пор я использую message.match(/string/i), чтобы увидеть, удаляется ли сообщение.Я пробовал использовать отрицательный прогноз, но, вероятно, использовал его неправильно.

РЕДАКТИРОВАТЬ: Извините, что не включил это ранее, но :blahstring: и :stringblah: и :blahstringblah: также не должны быть удалены.

Ответы [ 5 ]

0 голосов
/ 12 февраля 2019

В некоторых граничных случаях двоеточие появляется только с одной стороны от «строки».Поэтому я считаю, что легче удалить все вхождения «: string:» и только потом искать совпадение «string»:

function deleteIt(msg) {
    return /string/i.test(msg.replace(/:\w*string\w*(?=:)/ig, ":"));
}

console.log(deleteIt("this is :string ")); // true
console.log(deleteIt("this is string: ")); // true
console.log(deleteIt("string:string: ")); // true
console.log(deleteIt("this is :string: ")); // false
console.log(deleteIt("this is :blastring:stringbla:string: ")); // false

Последний тест в приведенном выше фрагменте является особым случаем.Двоеточие «разделяется» предыдущей и следующей «строкой».В зависимости от того, хотите ли вы, чтобы такие «строковые» вхождения игнорировались или нет, вам может потребоваться заменить предварительный просмотр обычным захватом второго двоеточия.

Приложение

При редактированиина вопрос, вы говорите, что ": blastring:" или ": stringbla:" также не должны вызывать удаление.

Итак, я добавил \w* дважды в регулярном выражении выше, чтобы соответствовать этому дополнительному требованию.

Если между двоеточием и «строкой» допустимы также знаки препинания или другие неалфавитные символы, например «:, - ° string ^ 0 &:», только не пробел, вместо этого используйте \S*\w*.

0 голосов
/ 12 февраля 2019

Попробуйте

let s=[ "string",
        "blah string",
        ":string blah",
        ":string: string",
        "thing :string:",
        ":blahstring:",
        ":stringblah:",
        ":blahstringblah:",
      ];

let d=s.filter(x=> !x.match(/:.*string.*:/i) || x.match(/:.*string.*:.*string.*/i) || x.match(/.*string.*:.*string.*:/i));

console.log('Delete :', d);
console.log('Save   :', s.filter(x=>!d.includes(x)) );

Мы помещаем в «список удаления» d элемент, который

  • !x.match(/:string:/i) - не содержит :string: или
  • x.match(/:.*string.*:.*string.*/i) содержит :string:, а затем string не окружен :
  • x.match(/.*string.*:.*string.*:/i) таким же, как указано выше, но наоборот
0 голосов
/ 12 февраля 2019

Вы можете использовать комбинацию положительного взгляда сзади и отрицательного взгляда:

(?<=^|[^:]|(:))string(?!\1)

Демонстрация: https://regex101.com/r/Ca1TTW/1

0 голосов
/ 12 февраля 2019

Это то, что мне помогло в моих тестах: ^.*(?<!\:)string(?!\:).*$

  • ^ Соответствует началу строки
  • .* Соответствует любому символу любое количество раз
  • (?<!\:) Соответствует, если отсутствует суффикс :
  • string Соответствует слову string
  • (?!\:) Соответствует, если суффикс отсутствует
  • .* Соответствует любому символу любое количество раз
  • $ Соответствует концу строки
0 голосов
/ 12 февраля 2019

Если поддерживается 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); }) ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...