Suche ohne Berücksichtigung der Groß- und Kleinschreibung

272

Ich versuche, eine Suche ohne Berücksichtigung der Groß- und Kleinschreibung mit zwei Zeichenfolgen in JavaScript zu erhalten.

Normalerweise wäre es so:

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

Die /iFlagge würde zwischen Groß- und Kleinschreibung unterscheiden.

Aber ich muss nach einer zweiten Zeichenfolge suchen. ohne Flagge funktioniert es perfekt:

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

Wenn ich das /iFlag zum obigen Beispiel hinzufüge, wird nach Suchzeichenfolge gesucht und nicht nach dem, was in der Variablen "Suchzeichenfolge" enthalten ist (nächstes Beispiel funktioniert nicht):

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

Wie kann ich das erreichen?

Chris Boesing
quelle

Antworten:

373

Ja .match, eher verwenden als .search. Das Ergebnis des .matchAufrufs gibt die tatsächliche Zeichenfolge zurück, die selbst abgeglichen wurde, kann jedoch weiterhin als boolescher Wert verwendet werden.

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

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

Die Verwendung eines solchen regulären Ausdrucks ist wahrscheinlich die sauberste und naheliegendste Methode, um dies in JavaScript zu tun. Beachten Sie jedoch, dass es sich um einen regulären Ausdruck handelt und daher Regex-Metazeichen enthalten kann. Wenn Sie die Zeichenfolge von einer anderen Stelle übernehmen möchten (z. B. Benutzereingaben) oder vermeiden möchten, dass viele Metazeichen maskiert werden müssen, verwenden Sie diese wahrscheinlich am besten indexOfwie folgt:

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');
}
Dan
quelle
9
Entschuldigung, wie können Sie in Ihrem ersten Beispiel "best" in eine Variable konvertieren? string.match(/best/i);
Doug Molineux
5
Warum würden Sie .matchfür den booleschen Vergleich verwenden. Es wird über das erste Ergebnis hinaus gesucht. Sie müssen nach dem ersten Spiel aufhören, was .testoder .searchtun. Überprüfen Sie hier die Leistung .
Rami
toLowerCasewird höchstwahrscheinlich den Türkei-Test ( moserware.com/2008/02/does-your-code-pass-turkey-test.html ) und ähnliche Probleme bei der Fallkonvertierung nicht bestehen . Ich bin mir nicht sicher, wie ReGexich damit umgehen soll, aber wenn ich raten müsste, würde ich es besser sagen.
Ohad Schneider
3
@DougMolineux können Sie den RegExp-Objektkonstruktor verwenden. var text = "best"; var exp = new RegExp(test, "i");. Dies ist das gleiche wie /best/i.
Medeni Baykal
174

Ersetzen

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

mit

var result= string.search(new RegExp(searchstring, "i"));
Sergey Ilinsky
quelle
7
Das ist ein ziemlich chaotischer Weg, da Maßnahmen ergriffen werden müssen, um sich vor unerwarteten Regexp-Metazeichen zu schützen.
Dan
35
Dan, ich bezweifle, dass meine Antwort -1 von dir verdient. Ich habe versucht, ChrisBo zu helfen, indem ich seine missbräuchliche Verwendung von JavaScript korrigiert habe, nämlich: var result = string.search (/ searchstring / i); zu einem richtigen, bei dem der variable Suchstring so verwendet wurde, wie er es beabsichtigt hatte.
Sergey Ilinsky
8
Dan hat recht (obwohl er wahrscheinlich " keine Maßnahmen" sagen wollte ): s = 'a[b'; r = new RegExp(s)führt zu einem Syntaxfehler (nicht abgeschlossene Zeichenklasse)
Glenn Jackman
39

Wenn Sie nur nach einer Zeichenfolge suchen und nicht nach einem komplizierteren regulären Ausdruck, können Sie diese verwenden. indexOf()Denken Sie jedoch daran, beide Zeichenfolgen zuerst in Kleinbuchstaben zu schreiben, da zwischen indexOf()Groß- und Kleinschreibung unterschieden wird:

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

Oder in einer einzigen Zeile:

var result = string.toLowerCase().indexOf(searchstring.toLowerCase())>=0;
Odilon Redo
quelle
24

Angenommen, wir möchten die Zeichenfolgenvariable needlein der Zeichenfolgenvariablen finden haystack. Es gibt drei Fallstricke:

  1. Internationalisierte Anwendungen sollten string.toUpperCaseund vermeiden string.toLowerCase. Verwenden Sie stattdessen einen regulären Ausdruck, bei dem Groß- und Kleinschreibung ignoriert wird. Zum Beispiel var needleRegExp = new RegExp(needle, "i");gefolgt von needleRegExp.test(haystack).
  2. Im Allgemeinen kennen Sie den Wert von möglicherweise nicht needle. Achten Sie darauf, dass needlekeine Sonderzeichen für reguläre Ausdrücke enthalten sind . Entkomme diesen mitneedle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); .
  3. In anderen Fällen müssen Sie, wenn Sie genau übereinstimmen needleund haystackdie Groß- und Kleinschreibung ignorieren möchten, "^"am Anfang und "$"am Ende Ihres Konstruktors für reguläre Ausdrücke hinzufügen .

Unter Berücksichtigung der Punkte (1) und (2) wäre ein Beispiel:

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);
Chris Chute
quelle
4

ES6 +:

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


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

includes()Gibt zurück, truewenn es searchStringan einer oder mehreren Positionen oder auf falseandere Weise angezeigt wird .

Andrey
quelle
2

Wenn Sie sich Sorgen über den Fall "nicht abgeschlossene Zeichenklasse" machen, ist es hilfreich, alle nicht alphanumerischen Zeichen zu entfernen:

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

Ich mag die Antwort von @ CHR15TO, im Gegensatz zu anderen Antworten, die ich auf andere ähnliche Fragen gesehen habe, zeigt diese Antwort tatsächlich, wie man einer vom Benutzer bereitgestellten Suchzeichenfolge richtig entgeht (anstatt zu sagen, dass dies notwendig wäre, ohne zu zeigen, wie).

Es ist jedoch immer noch ziemlich klobig und möglicherweise relativ langsam. Warum also nicht eine spezifische Lösung für die wahrscheinlich übliche Anforderung an Codierer haben? (Und warum nicht in die ES6 API BTW aufnehmen?)

Meine Antwort [ https://stackoverflow.com/a/38290557/887092] auf eine ähnliche Frage ermöglicht Folgendes:

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

Es gibt zwei Möglichkeiten für einen Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung:

  1. Konvertieren Sie Zeichenfolgen in Großbuchstaben und vergleichen Sie sie dann mit dem strengen Operator ( ===). Wie streng Operatoren mit Operanden umgehen, lesen Sie unter: http://www.thesstech.com/javascript/relational-logical-operators

  2. Mustervergleich mit String-Methoden:

    Verwenden Sie die Zeichenfolgenmethode "search" für die Suche ohne Berücksichtigung der Groß- und Kleinschreibung. Weitere Informationen zur Suche und zu anderen Zeichenfolgenmethoden finden Sie unter: 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>
Sohail Arif
quelle
1

Ich mache das oft und verwende einen einfachen 5-Zeilen-Prototyp, der Varargs akzeptiert. Es ist schnell und funktioniert überall .

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

Steven Spungin
quelle
0

Sie können alles in Kleinbuchstaben schreiben:

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

Ich habe festgestellt, dass, wenn der Benutzer eine Textzeichenfolge eingibt, die Eingabe jedoch verlässt, ohne eine der Optionen für die automatische Vervollständigung auszuwählen, in der ausgeblendeten Eingabe kein Wert festgelegt wird, selbst wenn die Zeichenfolge mit einer im Array übereinstimmt. Mit Hilfe der anderen Antworten habe ich Folgendes gemacht:

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

            }
        } 
Vor
quelle