source

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

factcode 2022. 9. 27. 23:47
반응형

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

JavaScript에서 2개의 문자열로 대소문자를 구분하지 않는 검색을 하려고 합니다.

통상, 다음과 같습니다.

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

이와 같은 정규 표현을 사용하는 것은 JavaScript에서 가장 깔끔하고 분명한 방법이지만 정규 표현이므로 regex 메타 문자를 포함할 수 있습니다.다른 곳(사용자 입력 등)에서 문자열을 가져오거나 많은 메타 문자를 이스케이프할 필요가 없는 경우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()사건:A대소문자를 구분합니다 민감하다.

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다. 세마리 gotchas 있습니다.3개의곶차가 있습니다.

  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()truesearchString 또는1개의 위치에 됩니다.false렇지지그

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

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

저는 @CHR15가 좋아요TO의 답변은 다른 유사한 질문에서 보았던 다른 답변과 달리 사용자가 제공한 검색 문자열을 올바르게 탈출하는 방법을 보여줍니다(방법을 제시하지 않고 필요한 것을 말하는 것이 아니라).

하지만, 그것은 여전히 꽤 투박하고, 아마도 상대적으로 느릴 것이다.그렇다면 코더의 일반적인 요건에 대한 구체적인 솔루션을 가지고 있는 것은 어떨까요?(그리고 ES6 API BTW에 포함시키는 것은 어떨까요?)

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

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

저는 이것을 자주 하고 있으며, 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')

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

  1. 문자열을 대문자로 변환한 다음 strict 연산자를 사용하여 비교합니다( ).===).

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

    대소문자를 구분하지 않는 검색에는 "search" 문자열 방식을 사용합니다.

<!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>

모두 소문자로 만들 수 있습니다.

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

대소문자를 구분하는 문자열 검색을 시도하다가

 var result = string.toLowerCase().match(searchstring) 

그리고 또

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

하지만 약간의 수정을 가했고, 그것은 나에게 효과가 있었다.

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

소문자, 대문자 또는 조합 중 하나입니다.

사용자가 텍스트 문자열을 입력했지만 자동 완성 옵션을 선택하지 않고 입력을 종료하면 문자열이 배열 내의 문자열과 일치하더라도 숨겨진 입력에 값이 설정되지 않습니다.그래서 저는 다른 대답들을 참고해서 이렇게 했습니다.

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

            }
        } 

언급URL : https://stackoverflow.com/questions/177719/case-insensitive-search

반응형