Büyük / küçük harfe duyarlı olmayan arama


272

JavaScript çalışma iki dizeleri ile büyük / küçük harf duyarsız bir arama almaya çalışıyorum.

Normalde şöyle olur:

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

/iBayrak küçük harf duyarsız için olurdu.

Ama ikinci bir dize aramak gerekir; bayrak olmadan mükemmel çalışır:

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

/iYukarıdaki örneğe bayrak eklerseniz, değişken "arama dizesi" (sonraki örnek çalışmıyor) için değil, arama dizesi için arar:

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

Bunu nasıl başarabilirim?

Yanıtlar:


373

Evet, kullanmak .matchyerine .search. .matchÇağrı sonucu, kendisiyle eşleşen gerçek dizeyi döndürür, ancak yine de bir boolean değeri olarak kullanılabilir.

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

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

Böyle bir normal ifade kullanma muhtemelen JavaScript bunu tidiest ve en açık yoldur, ama unutmayın ki o olduğunu regex meta karakterler içerebilir böylece normal bir ifade ve. Dizeyi başka bir yerden almak istiyorsanız (örneğin, kullanıcı girişi) veya çok fazla meta karakterden kaçmak zorunda kalmamak istiyorsanız, muhtemelen en iyi şu şekilde kullanılır 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
Maalesef ilk örneğinizde "en iyiyi" bir değişkene nasıl dönüştürebilirsiniz? string.match(/best/i);
Doug Molineux

5
.matchBoole karşılaştırması için neden kullanılır ? İlk sonucun ötesinde arama yapar. Hangi .testya da ilk maçtan sonra durdurmanız gerekir .search. Performansı buradan kontrol edin .
Rami

toLowerCasebüyük olasılıkla Türkiye Testinde ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) ve benzer vaka dönüştürme sorunlarında başarısız olacaktır . Nasıl ReGexhallettiğinden emin değilim , ama tahmin etsem daha iyi söylerdim.
Ohad Schneider

3
@ DougMolineux, RegExp nesne yapıcısını kullanabilirsiniz. var text = "best"; var exp = new RegExp(test, "i");. Bu aynı /best/i.
Medeni Baykal

174

değiştirmek

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

ile

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

7
Beklenmedik normal ifade metakarakterlerine karşı koruma önlemleri alması gerektiğinden, bu durum oldukça dağınık bir yoldur.
Dan

35
Dan, cevabımın senden -1 hak ettiğinden şüpheliyim. ChrisBo JavaScript yanlış kullanımını düzelterek yardımcı denedim, yani: var sonuç = string.search (/ searchstring / i); Değişken arama dizisinin istediği şekilde kullanıldığı uygun bir yere.
Sergey Ilinsky

8
(Muhtemelen "demek istedi ama Dan sağ hiçbir önlem"): s = 'a[b'; r = new RegExp(s)(unterminated karakter sınıfı) bir sözdizimi hatası sonucu
Glenn Jackman

39

Daha karmaşık bir normal ifade yerine yalnızca bir dize arıyorsanız indexOf()- kullanabilirsiniz - ancak büyük / küçük indexOf()harfe duyarlı olduğundan önce her iki dizeyi de küçük harflerle yazmayı unutmayın :

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

Veya tek bir satırda:

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

24

Biz dize değişkeni bulmak istediğinizi varsayalım needledize değişkeni haystack. Üç gotcha var:

  1. Uluslararası uygulamalar kaçınmalı string.toUpperCaseve string.toLowerCase. Bunun yerine büyük / küçük harf kullanımını yoksayan normal bir ifade kullanın. Örneğin, var needleRegExp = new RegExp(needle, "i");ardından needleRegExp.test(haystack).
  2. Genel olarak, değerini bilmiyor olabilirsiniz needle. needleNormal ifade özel karakterleri içermediğinden emin olun . Bunları kullanarak kaçmak needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");.
  3. Diğer durumlarda, eğer tam olarak eşleştirmek istediğiniz needleve haystacksadece davayı görmezden eklemek için emin olun "^"başında ve "$"normal ifadeniz yapıcı sonunda.

(1) ve (2) maddelerini dikkate alırsak, bir örnek:

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()döner trueeğer searchStringbir veya daha fazla pozisyonda ya da görüntülenene falseaksi.


2

"Sonlandırılmamış karakter sınıfı" durumu hakkında endişeleriniz varsa, alfasayısal olmayan tüm karakterleri kaldırmak yardımcı olacaktır:

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

2

@ CHR15TO'nun cevabını seviyorum, diğer benzer sorularda gördüğüm diğer cevapların aksine, bu cevap aslında bir kullanıcı tarafından sağlanan arama dizesinden nasıl düzgün kaçacağını gösterir (bunun nasıl gösterilmeden gerekli olacağını söylemek yerine).

Bununla birlikte, hala oldukça tıknaz ve muhtemelen nispeten daha yavaştır. Öyleyse neden kodlayıcılar için ortak bir gereksinim olana spesifik bir çözüm bulunmuyor? (Ve neden ES6 API BTW'ye dahil etmiyorsunuz?)

Benzer bir soruya cevabım [ https://stackoverflow.com/a/38290557/887092] aşağıdakileri mümkün kılıyor:

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

1

Büyük / küçük harfe duyarlı olmayan karşılaştırmanın iki yolu vardır:

  1. Dizeleri büyük harfe dönüştürün ve ardından katı operatörü ( ===) kullanarak bunları karşılaştırın . Sıkı operatör işlenenlere şu bilgileri okurken nasıl davranır: http://www.thesstech.com/javascript/relational-logical-operators

  2. Dize yöntemlerini kullanarak desen eşleştirme:

    Büyük / küçük harfe duyarlı olmayan arama için "arama" dizesi yöntemini kullanın. Arama ve diğer dize yöntemleri hakkında bilgi için: 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

Bunu sık sık yapıyorum ve varargs kabul eden 5 satırlı basit bir prototip kullanıyorum. Öyle hızlı ve çalışır her yerde .

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

Her şeyi küçük harflerle yapabilirsiniz:

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

-1

Kullanıcı bir metin dizesi girer, ancak herhangi bir otomatik tamamlama seçenekleri seçmeden girdi bırakırsa, dizi dizisinde biri ile çakışsa bile, gizli girdide hiçbir değer ayarlanmadığını fark ettim. Yani, diğer cevapların yardımıyla bunu yaptım:

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

            }
        } 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.