Определите, содержит ли строка хотя бы 2 одинаковых элемента из массива - PullRequest
8 голосов
/ 01 октября 2019

Я хочу определить, содержит ли строка хотя бы 2 одинаковых элемента из массива

const array = ["!", "?"];

const string1 = "!hello"; // should return false
const string2 = "!hello?"; // should return false
const string3 = "!hello!"; // should return true
const string4 = "hello ??"; // should return true
const string5 = "hello ?test? foo"; // should return true
const string6 = "hello ?test ?? foo"; // should return true

Я не уверен, что будет лучше: регулярное выражение или функция? Любой будет в порядке.

Я пробовал это:

const array = ["!", "?"];
const string = "test!";

array.every(ar => !string.includes(ar));

Но он обнаруживает только если есть хотя бы 1 элемент из массива, а не 2.

Ответы [ 9 ]

7 голосов
/ 01 октября 2019

Вы можете использовать Array#some и String#split, чтобы сделать это:

const check=(array,string)=>array.some(char=>(string.split(char).length-1)>=2)

const array = ["!", "?"];

console.log(check(array,"!hello"))
console.log(check(array,"!hello?"))
console.log(check(array,"!hello!"))
console.log(check(array,"hello ??"))
console.log(check(array,"hello ?test? foo"))
console.log(check(array, "hello ?test ?? foo"))

Как это работает?

Давайте разделимся (я имею в виду split() вверх)!

const check=(array,string)=>
  array.some(char=>
    (
      string.split(char)
      .length-1
    )>=2
  )
  • Сначала используйте Array#some, который проверяет, что хотя бы один элемент массива должен пройти(т. е. ? или !)
  • Разделите строку на char и посчитайте, сколько у нас деталей
    • Если у нас есть n деталей, это означаетчто у нас есть n-1 мест, где char совпадает. (например, 2 | разбивает строку на 3 части: a|b|c)
  • Наконец, проверьте, есть ли у нас 2 или более разделителей
2 голосов
/ 01 октября 2019

Другим способом является использование шаблона с группой захвата и динамически создаваемым классом символов для [!?] и обратной ссылкой \1 на то, что захватывается в группе 1 дляубедитесь, что присутствуют 2 одинаковых символа.

([!?]).*\1

Regex demo

Например

const array = ["!", "?"];
const regex = new RegExp("([" + array.join(("")) + "]).*\\1");
[
  "!hello",
  "!hello?",
  "!hello!",
  "hello ??",
  "hello ?test? foo",
  "hello ?test ?? foo"
].forEach(str => console.log(str + ": " + regex.test(str)));
1 голос
/ 01 октября 2019

Вы можете следовать очень простому решению, как показано ниже. Разбейте строку, используя символ в массиве. проверьте левую часть операции разделения. Если длина минимальна 2, верните true, иначе false.

Вот пример jsFiddle: https://jsfiddle.net/sagarag05/qk8f2Lz7/

const array = ["!", "?"];
var str = "How are you!! doing !today?";

function isFound(arr, str){
  var isPresent = false;
  for(var i=0; i < arr.length; i++){
      var res = str.split(arr[i]);
      if(res.length-1 >= 2){
          isPresent = true;
          break;
      }
  }
  return isPresent;
}
isFound(array, str);
1 голос
/ 01 октября 2019

Вы можете использовать строку split и массив length, например:

const array = ["!", "?"];
const string6 = "hello ?test ?? foo"; 
var len1 = string6.split(array[0]).length;
var len2 = string6.split(array[1]).length;

if (len>2)||(len2>2)
 return true;

РЕДАКТИРОВАТЬ : использование для цикла

for (let i=0;i<array.length;i++){
 var len = string6.split(array[i]).length;
 if (len>2)
  return true;
}
return false;
0 голосов
/ 06 октября 2019

function checkDups(arr, str) {
    var ctr = [];


    for (var i = 0; i < arr.length; i++) {
        var pos = str.indexOf(arr[i]);
        var count = 0;
        ctr[i] = 0;


        while (pos > -1) {
            ++count;
            pos = str.indexOf(arr[i], ++pos);
        }



        if (count >= 2) {
            return true
        }

    }


    return false
}

console.log(checkDups(["!", "?"], "!hello"))
console.log(checkDups(["!", "?"], "!hello?"))
console.log(checkDups(["!", "?"], "!hello!"))
console.log(checkDups(["!", "?"], "hello ??"))
console.log(checkDups(["!", "?"], "hello ?test? foo"))
console.log(checkDups(["!", "?"], "hello ?test ?? foo"))
0 голосов
/ 02 октября 2019

Для этого есть гораздо более простое решение:

var a = ["!", "?"], s = "!hello!";
a.some(v=>s.split(v).length>2) // (returns true if multiples are found)

Мы можем превратить его в функцию для проверки:

const a = ["!", "?"];
function Test(s) { return a.some(v => s.split(v).length > 2) }
const string1 = "!hello"; // should return false
const string2 = "!hello?"; // should return false
const string3 = "!hello!"; // should return true
const string4 = "hello ??"; // should return true
const string5 = "hello ?test? foo"; // should return true
const string6 = "hello ?test ?? foo"; // should return true

console.log(Test(string1), Test(string2), Test(string3), Test(string4), 
  Test(string5), Test(string6));

> false false true true true true

Примечание. Мой код несколько раз менялся и вконец был близок к принятому ответу, и я не осознавал. Тем не менее, вам не нужно ничего вычитать, так что эта часть не нужна.

0 голосов
/ 01 октября 2019

Создайте функцию, которая может быть полезна для n количества обнаруженных случаев

const arrayData = ["!", "?"];
const strData = "test!";

function checkElements(arr, str, occNum) {
   var ctr = 0;
   arr.forEach(function (elem) { if(str.includes(elem)) ctr++});

   return ctr >= occNum
}

checkElements(arrayData, strData, 2)
0 голосов
/ 01 октября 2019

Вот подход трюка с регулярными выражениями. Мы можем попытаться удалить все символы из ввода, которые не часть класса символов для поиска. Затем подтвердите, что на входе осталось как минимум два различных символа.

var input = "!hello?";
input = input.replace(/[^!?]+/g, "");
if (/(.).*(?!\1)./.test(input)) {
    console.log("MATCH");
}
else {
    console.log("NO MATCH");
}

Логика здесь довольно проста. Используя в качестве примера входные данные !hello?, мы сначала удаляем все не маркерные символы, оставляя нам !?. Затем мы используем регулярное выражение, чтобы утверждать, что осталось не менее двух различных символов. Это верно для этого ввода, поэтому мы печатаем MATCH.

Редактировать:

Чтобы построить чередование регулярных выражений из вашего входного массива, используйте join:

const array = ["!", "?"];
var regex = "[^" + array.join("") + "]+";
0 голосов
/ 01 октября 2019

Использовать цикл по массиву и счетчик вхождений, а затем проверить, является ли вхождение больше 1.

function has2(string1, array)
{
    for(let i=0;i<array.length;i++)
    {
        if (string1.split('').reduce(function(n, val) {
                return n + (val === array[i]);
            }, 0) > 1) 
        {
                return true;
        }
    }
    return false;
}

console.log(has2("!hello!", ["!", "?"])); // true
console.log(has2("!hello?", ["!", "?"])); // false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...