JavaScript에서 문자열에 하위 문자열 배열의 텍스트가 포함되어 있는지 확인하는 방법은 무엇입니까?


163

꽤 직설적 인. 자바 스크립트에서 문자열에 배열에 포함 된 하위 문자열이 포함되어 있는지 확인해야합니다.


map()새로운 HTML5-JavaScript 버전 에는 기능이 없습니까? 그 주제에 대해 읽은 것을 기억합니다 ...
Martin Hennings

@Martin : 좋은 지적하지 map그래서만큼 some. some도움이 될 것이지만 함수를 전달해야합니다.
TJ Crowder

답변:


222

당신을 위해 그것을 할 내장 기능은 없습니다, 당신은 그것을위한 함수를 작성해야합니다.

당신이 경우 문자열이 정규 표현식에서 특별 문자 중 하나를 포함하지 않는, 당신은이 같은 비트를 속일 수 있습니다 :

if (new RegExp(substrings.join("|")).test(string)) {
    // At least one match
}

... 당신이 찾고있는 하위 문자열에 대한 일련의 대안 인 정규 표현식을 만들고 (예 one|two:) 일치하는 항목이 있는지 테스트하지만 하위 문자열 중 하나에 특수 문자가 포함되어 있는지 테스트 정규식 ( *, [등)에서는 먼저 탈출해야하며 대신 지루한 루프를 수행하는 것이 좋습니다.

라이브 예 :


이 질문에 대한 의견에서 MartinArray.prototype.mapECMAScript5 의 새로운 방법에 대해 묻습니다 . map그다지 도움이되지는 않지만 다음 some과 같습니다.

if (substrings.some(function(v) { return str.indexOf(v) >= 0; })) {
    // There's at least one
}

라이브 예 :

ECMAScript5 호환 구현에서만 사용할 수 있지만 polyfill에는 쉽지 않습니다.


2020 년 업데이트 : some화살표 기능 (ES2015 +)으로 예제가 더 간단 할 수 있으며 다음 includes대신에 사용할 수 있습니다 indexOf.

if (substrings.some(v => str.includes(v))) {
    // There's at least one
}

라이브 예 :

bind나에게 화살표 기능을 훨씬 더 읽을 수 있지만 그것을 던지 십시오.

if (substrings.some(str.includes.bind(str))) {
    // There's at least one
}

라이브 예 :


2
"정말로 약간의 오버 헤드를 의미 하지만 ..." 에 관심이 없습니다 .
TJ Crowder 2016 년

'|':을 제외한 모든 정규식 문자를 제거하여 위의 솔루션을 확장 할 수 있습니다 new RegExp(substrings.join("|").replace(/[^\w\s^|]/gi, '')).test(string).
user007 2016 년

indexOf를 사용하면 퍼지가 발생하여 이상한 결과가 나올 수 있습니다. equal의 연산자를 사용하여 문자열과 간단히 일치시킬 수 있습니다. 예를 들어, ('disconnect'.indexOf('connect') >= 0) === true하지만('disconnect' === 'conenct') === false
kylewelsby

@halfcube : 응? 나는 당신을 이해하지 못한다, 나는 두렵다. 위의 답변에서 'disconnect' === 'connect'아무것도 아닌 것을 제안하는 것은 없습니다 false. 또한 indexOf퍼지가 아니며 실제로 매우 명확하게 정의되어 있습니다.
TJ Crowder 2016 년

indexOf모두 일치 disconnectconnect내가 경험 한 경우에 어디에,이 내가 조건에 대한 결과를 반환 할 두 가지 경우가 있습니다.
kylewelsby6

54
var yourstring = 'tasty food'; // the string to check against


var substrings = ['foo','bar'],
    length = substrings.length;
while(length--) {
   if (yourstring.indexOf(substrings[length])!=-1) {
       // one of the substrings is in yourstring
   }
}

50

한 줄 솔루션

substringsArray.some(substring=>yourBigString.includes(substring))

true\false부분 문자열 인 경우 반환exists\does'nt exist

ES6 지원 필요


화살표 기능을 사용한 훌륭한 솔루션
GuerillaRadio

7
너 애들 .. 내가 어렸을 때 우리는 'for'루프라고 불리는 것들을 사용해야했고, 여러 줄을 사용해야하고 배열이 1 또는 0 기반인지 여부를 알아야했습니다. 그것은 잘못되었고 디버깅하고 'i'라는 작은 버거를 찾아야했습니다.
aamarks

25
function containsAny(str, substrings) {
    for (var i = 0; i != substrings.length; i++) {
       var substring = substrings[i];
       if (str.indexOf(substring) != - 1) {
         return substring;
       }
    }
    return null; 
}

var result = containsAny("defg", ["ab", "cd", "ef"]);
console.log("String was found in substring " + result);

1
이해하기 쉬운 것!
Daryl H

또한 문자열에서 단어의 첫 항목을 반환하므로 매우 유용합니다. 참 / 거짓뿐만 아니라
Kai Noack

20

인터넷 검색을하는 사람들에게

확실한 대답이되어야합니다.

const substrings = ['connect', 'ready'];
const str = 'disconnect';
if (substrings.some(v => str === v)) {
   // Will only return when the `str` is included in the `substrings`
}

2
또는 더 짧음 : if (substrings.some (v => v === str)) {
kofifus

10
이것은 약간 다른 질문에 대한 답변이며, 문자열 에 하위 문자열 배열의 텍스트가 포함되어 있는지 묻습니다 . 이 코드는 문자열 하위 문자열 중 하나 인지 확인합니다 . 내가 생각하는 "포함"의 의미에 달려있다.
fcrick

8
var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = 0, len = arr.length; i < len; ++i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}

편집 : 테스트 순서가 중요하지 않으면 루프 변수를 하나만 사용하여 이것을 사용할 수 있습니다.

var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = arr.length - 1; i >= 0; --i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}

첫 번째 예제에는 len변수 가 필요하지 않으므로 확인하십시오 i < arr.length.
그레이 세이지

3

배열이 크지 않으면을 사용하여 개별적으로 각 하위 문자열에 대해 문자열을 반복 확인 할 수 있습니다 indexOf(). 또는 대안으로 하위 문자열을 사용하여 정규 표현식을 작성할 수 있습니다.


100 개의 하위 문자열 목록이 있다고 가정 해 봅시다. RegExp 또는 루프 중 어느 방법이 더 효율적입니까?
Diyorbek Sadullayev

3

검색 문자열 또는 검색 문자열 배열을 사용하여 태그 또는 키워드 배열을 검색하는 Javascript 기능. ( ES5 일부 어레이 방법 및 ES6 화살표 기능 사용 )

// returns true for 1 or more matches, where 'a' is an array and 'b' is a search string or an array of multiple search strings
function contains(a, b) {
    // array matches
    if (Array.isArray(b)) {
        return b.some(x => a.indexOf(x) > -1);
    }
    // string match
    return a.indexOf(b) > -1;
}

사용법 예 :

var a = ["a","b","c","d","e"];
var b = ["a","b"];
if ( contains(a, b) ) {
    // 1 or more matches found
}

2

나는 당신 String이 프로토 타입을 확장 / 수정하도록 제안하고 있지는 않지만 이것이 내가 한 일입니다.

String.prototype.includes ()

String.prototype.includes = function (includes) {
    console.warn("String.prototype.includes() has been modified.");
    return function (searchString, position) {
        if (searchString instanceof Array) {
            for (var i = 0; i < searchString.length; i++) {
                if (includes.call(this, searchString[i], position)) {
                    return true;
                }
            }
            return false;
        } else {
            return includes.call(this, searchString, position);
        }
    }
}(String.prototype.includes);

console.log('"Hello, World!".includes("foo");',          "Hello, World!".includes("foo")           ); // false
console.log('"Hello, World!".includes(",");',            "Hello, World!".includes(",")             ); // true
console.log('"Hello, World!".includes(["foo", ","])',    "Hello, World!".includes(["foo", ","])    ); // true
console.log('"Hello, World!".includes(["foo", ","], 6)', "Hello, World!".includes(["foo", ","], 6) ); // false


2

TJ Crowder의 솔루션에서이 문제를 처리 할 프로토 타입을 만들었습니다.

Array.prototype.check = function (s) {
  return this.some((v) => {
    return s.indexOf(v) >= 0;
  });
};

2
substringsArray.every(substring=>yourBigString.indexOf(substring) === -1)

전폭 지원;)


2

가장 좋은 답변은 다음과 같습니다. 대소 문자를 구분하지 않습니다.

    var specsFilter = [.....];
    var yourString = "......";

    //if found a match
    if (specsFilter.some((element) => { return new RegExp(element, "ig").test(yourString) })) {
        // do something
    }

1

underscore.js 또는 lodash.js를 사용하여 문자열 배열에서 다음을 수행 할 수 있습니다.

var contacts = ['Billy Bob', 'John', 'Bill', 'Sarah'];

var filters = ['Bill', 'Sarah'];

contacts = _.filter(contacts, function(contact) {
    return _.every(filters, function(filter) { return (contact.indexOf(filter) === -1); });
});

// ['John']

그리고 단일 문자열에서 :

var contact = 'Billy';
var filters = ['Bill', 'Sarah'];

_.every(filters, function(filter) { return (contact.indexOf(filter) >= 0); });

// true

1

이것은 늦었지만이 문제에 부딪 쳤습니다. 내 자신의 프로젝트에서 다음을 사용하여 문자열이 배열에 있는지 확인했습니다.

["a","b"].includes('a')     // true
["a","b"].includes('b')     // true
["a","b"].includes('c')     // false

이렇게하면 미리 정의 된 배열을 가져 와서 문자열이 포함되어 있는지 확인할 수 있습니다.

var parameters = ['a','b']
parameters.includes('a')    // true

1

TJ Crowder의 답변을 바탕으로

이스케이프 된 RegExp를 사용하여 하나 이상의 하위 문자열이 "한 번 이상"발생하는지 테스트합니다.

function buildSearch(substrings) {
  return new RegExp(
    substrings
    .map(function (s) {return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');})
    .join('{1,}|') + '{1,}'
  );
}


var pattern = buildSearch(['hello','world']);

console.log(pattern.test('hello there'));
console.log(pattern.test('what a wonderful world'));
console.log(pattern.test('my name is ...'));


1

공백 또는 다른 일반적인 문자로 구분 된 전체 "단어"로 구성된 하위 문자열의 긴 목록을 사용하는 경우 검색에서 약간 영리 할 수 ​​있습니다.

먼저 문자열을 X 그룹으로 나눈 다음 X + 1, X + 2, ..., 최대 Y로 나눕니다. X와 Y는 각각 가장 적은 단어와 가장 작은 단어를 가진 하위 문자열의 단어 수 여야합니다. 예를 들어 X가 1이고 Y가 4 인 경우 "알파 베타 감마 델타"는 다음이됩니다.

"알파" "베타" "감마" "델타"

"알파 베타" "베타 감마" "감마 델타"

"알파 베타 감마" "베타 감마 델타"

"알파 베타 감마 델타"

X가 2이고 Y가 3이면 첫 번째 행과 마지막 행을 생략합니다.

이제 문자열 비교보다 훨씬 빠른 속도로이 목록을 세트 (또는 맵)에 삽입하면이 목록을 빠르게 검색 할 수 있습니다.

단점은 "ta Gamm"과 같은 하위 문자열을 검색 할 수 없다는 것입니다. 물론 단어 대신 문자로 나누면 가능합니다. 그러나 종종 대규모 세트를 만들어야하며 그렇게하는 데 소요되는 시간 / 메모리가 이점보다 중요합니다.


1

전체 지원 (@ricca의 버전에 추가 ).

wordsArray = ['hello', 'to', 'nice', 'day']
yourString = 'Hello. Today is a nice day'.toLowerCase()
result = wordsArray.every(w => yourString.includes(w))
console.log('result:', result)


0

다음과 같이 확인할 수 있습니다.

<!DOCTYPE html>
<html>
   <head>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
      <script>
         $(document).ready(function(){
         var list = ["bad", "words", "include"] 
         var sentence = $("#comments_text").val()

         $.each(list, function( index, value ) {
           if (sentence.indexOf(value) > -1) {
                console.log(value)
            }
         });
         });
      </script>
   </head>
   <body>
      <input id="comments_text" value="This is a bad, with include test"> 
   </body>
</html>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.