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


272

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

어떻게하면 되나요?

답변:


373

예, .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');
}

9
첫 번째 예에서 "best"를 변수로 어떻게 변환 할 수 있습니까? string.match(/best/i);
Doug Molineux

5
.match부울 비교에 왜 사용 하시겠습니까? 첫 번째 결과를 넘어서 검색합니다. 당신은 첫 번째 경기 후 .test또는 중지해야합니다 .search. 여기에서 성능을 확인 하십시오 .
Rami

toLowerCase터키 테스트 ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) 및 유사한 사례 변환 문제에 실패 할 가능성이 큽니다 . 어떻게 ReGex처리 하는지 잘 모르겠지만 추측해야한다면 더 잘 말할 것입니다.
하드 슈나이더

3
@DougMolineux는 RegExp 객체 생성자를 사용할 수 있습니다. var text = "best"; var exp = new RegExp(test, "i");. 이것은와 동일합니다 /best/i.
Medeni Baykal

174

바꾸다

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

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

7
예기치 않은 정규 표현식 메타 문자로부터 보호하기 위해 조치를 취하기 때문에 다소 혼란 스럽습니다.
Dan

35
댄, 내 대답이 당신에게서 -1을 받아야한다고 생각합니다. JavaScript의 부적절한 사용을 수정하여 ChrisBo를 돕습니다. var result = string.search (/ searchstring / i); 변수 검색 문자열이 의도 한대로 사용 된 적절한 위치로
Sergey Ilinsky

8
Dan의 권리 (아마도 " 측정 값 없음 "이라고 말했을 수도 있음 ) : s = 'a[b'; r = new RegExp(s)구문 오류가 발생합니다 (문자화되지 않은 문자 클래스)
glenn jackman

39

좀 더 복잡한 정규 표현식이 아닌 문자열을 검색하는 경우 사용할 수 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;

24

문자열 변수 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);

4

ES6 + :

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


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

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


2

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

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

2

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

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

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

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

1

대소 문자를 구분하지 않는 비교에는 두 가지 방법이 있습니다.

  1. 문자열을 대문자로 변환 한 다음 엄격한 연산자 ( ===)를 사용하여 비교하십시오 . 엄격한 연산자가 피연산자를 처리하는 방법 읽기 자료 : http://www.thesstech.com/javascript/relational-logical-operators

  2. 문자열 메소드를 사용한 패턴 일치 :

    대소 문자를 구분하지 않는 검색에는 "search"문자열 방법을 사용하십시오. http://www.thesstech.com/pattern-matching-using-string-methods 에서 검색 및 기타 문자열 메소드에 대해 읽으십시오 .

    <!doctype html>
      <html>
        <head>
          <script>
    
            // 1st way
    
            var a = "apple";
            var b = "APPLE";  
            if (a.toUpperCase() === b.toUpperCase()) {
              alert("equal");
            }
    
            //2nd way
    
            var a = " Null and void";
            document.write(a.search(/null/i)); 
    
          </script>
        </head>
    </html>

1

나는 이것을 자주 하고 varargs를 허용하는 간단한 5 라인 프로토 타입을 사용합니다. 그것은이다 빠른 및 작동 사방 .

myString.containsIgnoreCase('red','orange','yellow')

/**
 * @param {...string} var_strings Strings to search for
 * @return {boolean} true if ANY of the arguments is contained in the string
 */
String.prototype.containsIgnoreCase = function(var_strings) {
  const thisLowerCase = this.toLowerCase()
  for (let i = 0; i < arguments.length; i++) {
    let needle = arguments[i]
    if (thisLowerCase.indexOf(needle.toLowerCase()) >= 0) {
      return true
    }
  }
  return false
}

/**
 * @param {...string} var_strings Strings to search for
 * @return {boolean} true if ALL of the arguments are contained in the string
 */
String.prototype.containsAllIgnoreCase = function(var_strings) {
  const thisLowerCase = this.toLowerCase()
  for (let i = 0; i < arguments.length; i++) {
    let needle = arguments[i]
    if (thisLowerCase.indexOf(needle.toLowerCase()) === -1) {
      return false
    }
  }
  return true
}

// Unit test

let content = `
FIRST SECOND
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
"At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat."
FOO BAR
`

let data = [
  'foo',
  'Foo',
  'foobar',
  'barfoo',
  'first',
  'second'
]

let result
data.forEach(item => {
  console.log('Searching for', item)
  result = content.containsIgnoreCase(item)
  console.log(result ? 'Found' : 'Not Found')
})

console.log('Searching for', 'x, y, foo')
result = content.containsIgnoreCase('x', 'y', 'foo');
console.log(result ? 'Found' : 'Not Found')

console.log('Searching for all', 'foo, bar, foobar')
result = content.containsAllIgnoreCase('foo', 'bar', 'foobar');
console.log(result ? 'Found' : 'Not Found')

console.log('Searching for all', 'foo, bar')
result = content.containsAllIgnoreCase('foo', 'bar');
console.log(result ? 'Found' : 'Not Found')


0

모든 것을 소문자로 만들 수 있습니다.

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

-1

사용자가 텍스트 문자열을 입력했지만 자동 완성 옵션을 선택하지 않고 입력을 그대로두면 문자열이 배열의 문자열과 일치하더라도 숨겨진 입력에 값이 설정되지 않습니다. 그래서 다른 답변의 도움으로 이것을 만들었습니다.

var $local_source = [{
        value: 1,
        label: "c++"
    }, {
        value: 2,
        label: "java"
    }, {
        value: 3,
        label: "php"
    }, {
        value: 4,
        label: "coldfusion"
    }, {
        value: 5,
        label: "javascript"
    }, {
        value: 6,
        label: "asp"
    }, {
        value: 7,
        label: "ruby"
    }];
    $('#search-fld').autocomplete({
        source: $local_source,
        select: function (event, ui) {
            $("#search-fld").val(ui.item.label); // display the selected text
            $("#search-fldID").val(ui.item.value); // save selected id to hidden input
            return false;
        },
        change: function( event, ui ) {

            var isInArray = false;

            $local_source.forEach(function(element, index){

                if ($("#search-fld").val().toUpperCase() == element.label.toUpperCase()) {
                    isInArray = true;
                    $("#search-fld").val(element.label); // display the selected text
                    $("#search-fldID").val(element.value); // save selected id to hidden input
                    console.log('inarray: '+isInArray+' label: '+element.label+' value: '+element.value);
                };

            });

            if(!isInArray){

                $("#search-fld").val(''); // display the selected text
                $( "#search-fldID" ).val( ui.item? ui.item.value : 0 );

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