[javascript] 대소 문자를 구분하지 않는 검색

JavaScript에서 두 문자열로 대소 문자를 구분하지 않고 검색하려고합니다.

일반적으로 다음과 같습니다.

var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);

/i플래그는 대소 문자를 구분하기위한 것입니다.

그러나 두 번째 문자열을 검색해야합니다. 플래그가 없으면 완벽하게 작동합니다.

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);

/i위의 예제에 플래그를 추가하면 검색 문자열을 검색하고 변수 “searchstring”에있는 것이 아닌 검색 문자열을 검색합니다 (다음 예제는 작동하지 않음).

var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(/searchstring/i);
alert(result);

어떻게하면 되나요?



답변

예, .match대신을 사용하십시오 .search. .match호출 결과는 자체적으로 일치하는 실제 문자열을 반환하지만 여전히 부울 값으로 사용할 수 있습니다.

var string = "Stackoverflow is the BEST";
var result = string.match(/best/i);
// result == 'BEST';

if (result){
    alert('Matched');
}

같은 정규 표현식을 사용하는 것은 아마 자바 스크립트에서 그렇게 할 수있는 tidiest 가장 확실한 방법이지만, 마음에 곰이 입니다 정규식 메타 문자를 포함 할 수 있습니다 따라서 정규 표현식합니다. 다른 곳에서 문자열을 가져 오거나 (예 : 사용자 입력) 많은 메타 문자를 피하지 않으려면 다음 indexOf과 같이 사용하는 것이 가장 좋습니다 .

matchString = 'best';
// If the match string is coming from user input you could do
// matchString = userInput.toLowerCase() here.

if (string.toLowerCase().indexOf(matchString) != -1){
    alert('Matched');
}


답변

바꾸다

var result= string.search(/searchstring/i);

var result= string.search(new RegExp(searchstring, "i"));


답변

좀 더 복잡한 정규 표현식이 아닌 문자열을 검색하는 경우 사용할 수 indexOf()있지만 대소 indexOf()문자를 구분 하므로 먼저 두 문자열을 모두 소문자로 사용해야 합니다.

var string="Stackoverflow is the BEST";
var searchstring="best";

// lowercase both strings
var lcString=string.toLowerCase();
var lcSearchString=searchstring.toLowerCase();

var result = lcString.indexOf(lcSearchString)>=0;
alert(result);

또는 한 줄로 :

var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;


답변

문자열 변수 needle에서 문자열 변수를 찾고 싶다고 가정 합니다 haystack. 세 가지 문제가 있습니다.

  1. 국제화 된 응용 프로그램은 string.toUpperCase및 을 피해야 string.toLowerCase합니다. 대신 대소 문자를 무시하는 정규식을 사용하십시오. 예를 들어, var needleRegExp = new RegExp(needle, "i");뒤에 needleRegExp.test(haystack).
  2. 일반적으로의 값을 모를 수 있습니다 needle. needle정규 표현식 특수 문자를 포함하지 않도록주의하십시오 . 을 사용하여 이스케이프 처리하십시오 needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");.
  3. 다른 경우에는, 경우에 정확하게 일치시킬 needle하고 haystack, 단지의 경우를 무시하고, 추가 확인 "^"을 시작할 때와 "$"정규 표현식 생성자의 끝에서.

포인트 (1)과 (2)를 고려할 때의 예는 다음과 같습니다.

var haystack = "A. BAIL. Of. Hay.";
var needle = "bail.";
var needleRegExp = new RegExp(needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"), "i");
var result = needleRegExp.test(haystack);
alert(result);


답변

ES6 + :

let string="Stackoverflow is the BEST";
let searchstring="best";


let found = string.toLowerCase()
                  .includes(searchstring.toLowerCase());

includes()반환 true하는 경우 searchString하나 개 이상의 위치 또는 나타납니다 false그렇지.


답변

“문자화되지 않은 문자 클래스”사례가 우려되는 경우 영숫자가 아닌 문자를 모두 제거하면 도움이됩니다.

searchstring = searchstring.replace (/ [^ a-zA-Z 0-9] + / g, '');


답변

@ CHR15TO의 답변은 다른 유사한 질문에서 본 다른 답변과 달리 실제로 제공된 방법으로 사용자가 제공 한 검색 문자열을 올바르게 이스케이프 처리하는 방법을 보여줍니다 (방법을 표시하지 않고 필요하다고 말하지는 않음).

그러나 여전히 엉성하고 상대적으로 느립니다. 그렇다면 코더의 일반적인 요구 사항에 대한 구체적인 솔루션이없는 이유는 무엇입니까? (그리고 ES6 API BTW에 포함시키지 않겠습니까?)

비슷한 질문에 대한 내 답변 [ https://stackoverflow.com/a/38290557/887092] 은 다음을 가능하게합니다.

var haystack = 'A. BAIL. Of. Hay.';
var needle = 'bail.';
var index = haystack.naturalIndexOf(needle);