文字列が配列から少なくとも2つの同じ要素を持っているかどうかを判別


8

文字列に配列の同じ要素が少なくとも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));

ただし、配列からの要素が2つではなく1つ以上あるかどうかを検出するだけです。


一致する配列の要素は2つだけでしょうか、それとも3つ以上あるかもしれませんか?
Tim Biegeleisen、

さらに可能性があります
Pleklo

回答:


7

あなたは使用することができます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。これは、配列の少なくとも1つの要素が渡す必要があることをテストします(つまり、?または!
  • 文字列をで分割し、charパーツの数を数えます
    • 我々が持っている場合はn部品を、それは我々が持っていることを意味n-1場所charマッチを。(2例えば|3つの部分に分割する文字列を:a|b|c
  • 最後に、2つ以上の区切り文字があるかどうかをテストします

これまでのベストアンサー、理解しやすく、かなり短いです!
Pleklo

あなたは正しい答えを受け入れる前に一定の時間を待たなければならないので、それを行うことができませんでした:-)
Pleklo

数分前にあなたの質問を受け入れようとしました、質問が尋ねられた瞬間から約15〜20分です
Pleklo

2

別の方法は、キャプチャグループと動的に作成された文字クラスでパターンを使用し、グループ1でキャプチャされたものへ[!?]の後方参照\1を使用して、同じ文字が2つ存在することを確認することです。

([!?]).*\1

正規表現のデモ

例えば

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)));


この作品は、しない限り、配列は、メタ文字が含まれている、例えば\、 、]^など
FZS

1

次のように文字列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ループの使用

for (let i=0;i<array.length;i++){
 var len = string6.split(array[i]).length;
 if (len>2)
  return true;
}
return false;

理にかなっていますが、配列にさらに要素が含まれている場合はどうなりますか?繰り返しの多いコードになります
Pleklo

1

以下のような非常に簡単な解決策に従うことができます。配列内の文字を使用して文字列を分割します。分割操作の左側を確認してください。長さが最小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);

これは機能しますが、OPは配列に必ずしも2つの要素が含まれるとは限らないと述べています...
FZs

それはまだ大丈夫です、このコードはあなたにロジックを与えるだけでした。これはforループを使用して変更できます。配列に存在するすべての文字を共有できますか?
Sagar Agrawal

私はそれを行う方法を知っており、あなたにあなたの答えをより良くするのを助けるためにあなたに通知しました
FZs

私はコードを変更しただけなので、配列に2つ以上の要素/文字がある場合も機能します。上記の変更されたロジックを参照してください。
Sagar Agrawal

0

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

配列のループを使用して出現回数をカウントし、出現回数が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


0

これが正規表現のトリックアプローチです。検索する文字クラスに含まれていないすべての文字を入力から削除してみることができます。次に、入力に少なくとも2つの異なる文字が残っていることをアサートします。

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

ここでのロジックはかなり単純です。!hello?例として入力を使用して、最初にすべての非マーカー文字を削除し、を残し!?ます。次に、正規表現を使用して、少なくとも2つの異なる文字が残っていることをアサートします。これはこの入力にも当てはまるので、MATCH

編集:

入力配列から正規表現の代替を構築するには、次を使用しますjoin

const array = ["!", "?"];
var regex = "[^" + array.join("") + "]+";

ええ、ティムの答えは正しくありません。「!hello?」と一致してはいけません
-Pleklo、

@Thefourthbirdイムは正規表現にかなり新しく、質問がありましたが、定義された配列を正規表現文字列内で使用できますか?
Pleklo

@Pleklo入力配列から正規表現パターンに取得する方法を示す更新を行いました。
Tim Biegeleisen、

0

これにはもっと簡単な解決策があります:

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

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"))

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.