Обнаружить повторный текст - PullRequest
2 голосов
/ 01 мая 2020

Я создаю диск-бот, используя node.js, и я хотел добавить в него функцию защиты от спама. Цель проста:

Я хотел бы сопоставить, используя регулярное выражение, предпочтительно следующее предложение:

hello my name is anon hello my name is anon hello my name is anon hello my name is anon

То, я не хочу, чтобы оно совпадало с этими строками :

hello my name is anon hello my name is anon hello my name is anon

hello my name is anon

hello, my name is anon hello my name is anon hello my name is anon hello my name is anon (обратите внимание на запятую в начале)

Конечно, несколько слов, которые я использую здесь может быть что угодно, вот и мне нужна твоя помощь ... Может ли регулярное выражение сделать это? Если так, то как? Я взглянул на границы слов и прочее, но я тут совсем растерялся ...

Заранее спасибо! :)

Ответы [ 2 ]

2 голосов
/ 02 мая 2020

Эта проблема сводится к нахождению непустой последовательности, такой, что повторяющиеся x раз равны всей строке.

Я предлагаю возможное решение:

function checkRep(str){
  return /^(.+?)\1+$/.test(str);
}

console.log(checkRep("example")); // false
console.log(checkRep("example example")); // false
console.log(checkRep("example example ")); // true
console.log(checkRep("example example hello")); // false

Обратите внимание, что \1 это просто обратная ссылка к совпадению (.+?).

И если вы не хотите чтобы учесть пробелы (рекомендуется), вы можете использовать:

function checkRep(str){
  return /^\s*(.+?)(\s*\1\s*)+$/.test(str);
}

console.log(checkRep("example")); // false
console.log(checkRep("example example")); // true
console.log(checkRep("example example ")); // true
console.log(checkRep("example example hello")); // false
1 голос
/ 02 мая 2020

Если вы хотите sh идентифицировать строки вида s s s sx, где s - общая подстрока, а x - любая подстрока, вы можете использовать регулярное выражение

^(.+)(?: +\1){3}

Демо

Модуль регулярных выражений выполняет следующие операции.

^            match beginning of line
(.*+)        match any char other than newline, 1+ times,
             saving to capture group 1
(?: +\1)     match 1+ spaces followed by the content of
             capture group 1 in a non-cap group
{3}          execute non-cap group 3 times
...