Ricerca senza distinzione tra maiuscole e minuscole


272

Sto cercando di ottenere una ricerca senza distinzione tra maiuscole e minuscole con due stringhe nel funzionamento di JavaScript.

Normalmente sarebbe così:

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

La /ibandiera sarebbe insensibile al maiuscolo / minuscolo.

Ma devo cercare una seconda stringa; senza la bandiera funziona perfettamente:

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

Se aggiungo il /iflag all'esempio sopra, cercherei la stringa di ricerca e non quella che si trova nella variabile "stringa di ricerca" (il prossimo esempio non funziona):

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

Come posso raggiungere questo obiettivo?

Risposte:


373

Sì, usa .match, piuttosto che .search. Il risultato della .matchchiamata restituirà la stringa effettiva che è stata abbinata a se stessa, ma può comunque essere utilizzata come valore booleano.

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

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

Usare un'espressione regolare come quella è probabilmente il modo più semplice e ovvio per farlo in JavaScript, ma tieni presente che è un'espressione regolare e quindi può contenere regex metacaratteri. Se vuoi prendere la stringa da altrove (es. Input dell'utente), o se vuoi evitare di dover sfuggire a molti metacaratteri, probabilmente stai meglio usando indexOfcosì:

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
Scusa come puoi convertire "best" in una variabile nel tuo primo esempio? string.match(/best/i);
Doug Molineux,

5
Perché dovresti usare .matchper il confronto booleano. Cerca oltre il primo risultato. È necessario fermarsi dopo la prima partita quale .testo .searchfare. Controlla le prestazioni qui .
Rami,

toLowerCasemolto probabilmente fallirà il Test della Turchia ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) e problemi simili di conversione dei casi. Non sono sicuro di come ReGexgestirlo, ma se dovessi indovinare direi meglio.
Ohad Schneider,

3
@DougMolineux puoi usare il costruttore di oggetti RegExp. var text = "best"; var exp = new RegExp(test, "i");. Questo è lo stesso di /best/i.
Medeni Baykal,

174

Sostituire

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

con

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

7
È un modo piuttosto disordinato per aggirarlo, poiché prende misure per proteggersi da metacaratteri regexp inaspettati.
Dan,

35
Dan, dubito che la mia risposta meriti -1 da te. Ho provato ad aiutare ChrisBo correggendo il suo uso improprio di JavaScript, vale a dire: var result = string.search (/ searchstring / i); a una vera e propria, in cui la stringa di ricerca variabile veniva utilizzata nel modo previsto.
Sergey Ilinsky,

8
Dan ha ragione (anche se probabilmente intendeva dire " nessuna misura"): s = 'a[b'; r = new RegExp(s)provoca un errore di sintassi (classe di caratteri non terminata)
glenn jackman,

39

Se stai solo cercando una stringa piuttosto che un'espressione regolare più complicata, puoi usare indexOf()- ma ricorda di mettere in minuscolo entrambe le stringhe perché indexOf()distingue tra maiuscole e minuscole:

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

O in una sola riga:

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

24

Supponiamo di voler trovare la variabile stringa needlenella variabile stringa haystack. Ci sono tre gotcha:

  1. Le applicazioni internazionalizzate dovrebbero evitare string.toUpperCasee string.toLowerCase. Usa invece un'espressione regolare che ignora il caso. Ad esempio, var needleRegExp = new RegExp(needle, "i");seguito da needleRegExp.test(haystack).
  2. In generale, potresti non conoscere il valore di needle. Fare attenzione che needlenon contenga caratteri speciali di espressioni regolari . Esci da questi usando needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");.
  3. In altri casi, se vuoi abbinare con precisione needlee haystack, semplicemente ignorando il caso, assicurati di aggiungere "^"all'inizio e "$"alla fine del tuo costruttore di espressioni regolari.

Prendendo in considerazione i punti (1) e (2), un esempio potrebbe essere:

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()ritorna truese searchStringappare in una o più posizioni o in falsealtro modo.


2

Se sei preoccupato per il caso "classe di caratteri non terminata", sarebbe utile rimuovere tutti i caratteri non alfanumerici:

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

2

Mi piace la risposta di @ CHR15TO, a differenza di altre risposte che ho visto su altre domande simili, quella risposta mostra in realtà come fuggire correttamente una stringa di ricerca fornita dall'utente (piuttosto che dire che sarebbe necessario senza mostrare come).

Tuttavia, è ancora piuttosto goffo e forse relativamente più lento. Quindi perché non avere una soluzione specifica per quello che è probabilmente un requisito comune per i programmatori? (E perché non includerlo nell'AP6 ESW BTW?)

La mia risposta [ https://stackoverflow.com/a/38290557/887092] su una domanda simile consente quanto segue:

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

1

Esistono due modi per il confronto senza distinzione tra maiuscole e minuscole:

  1. Converti le stringhe in maiuscolo e poi confrontale usando l'operatore rigoroso ( ===). In che modo gli operatori rigorosi trattano gli operandi leggendo le informazioni su: http://www.thesstech.com/javascript/relational-logical-operators

  2. Corrispondenza del modello mediante metodi stringa:

    Utilizzare il metodo di stringa "cerca" per la ricerca senza distinzione tra maiuscole e minuscole. Leggi la ricerca e altri metodi di stringa su: 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

Lo faccio spesso e utilizzo un semplice prototipo a 5 righe che accetta varargs. È veloce e funziona ovunque .

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

Puoi rendere tutto minuscolo:

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

-1

Ho notato che se l'utente inserisce una stringa di testo ma lascia l'input senza selezionare nessuna delle opzioni di completamento automatico, nessun valore viene impostato nell'input nascosto, anche se la stringa coincide con una nell'array. Quindi, con l'aiuto delle altre risposte, ho fatto questo:

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

            }
        } 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.