web-dev-qa-db-de.com

Suche nach Groß- und Kleinschreibung

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

Das /i-Flag würde auf Groß- und Kleinschreibung achten.

Aber ich muss nach einer zweiten Saite suchen. Ohne Flagge funktioniert es perfekt:

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

Wenn ich dem obigen Beispiel das Flag /i hinzufüge, würde es nach searchstring und nicht nach dem suchen, was in der Variablen "searchstring" steht (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?

257
Chris Boesing

Ja, benutze .match anstatt .search. Das Ergebnis des .match -Aufrufs gibt die tatsächliche Zeichenfolge zurück, die selbst gefunden 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 Möglichkeit, dies in JavaScript zu tun. Beachten Sie jedoch, dass es sich bei um einen regulären Ausdruck handelt Kann Regex-Metazeichen enthalten. Wenn Sie die Zeichenfolge von einer anderen Stelle übernehmen möchten (z. B. Benutzereingabe) oder wenn Sie vermeiden möchten, viele Metazeichen zu maskieren, sollten Sie indexOf wie folgt verwenden:

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

Ersetzen

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

mit

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

Wenn Sie nur nach einem String und nicht nach einem komplizierteren regulären Ausdruck suchen, können Sie indexOf() verwenden. Denken Sie jedoch daran, zuerst beide Zeichenketten in Kleinbuchstaben zu schreiben, da indexOf() die Groß- und Kleinschreibung berücksichtigt:

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;
37
Odilon Redo

Angenommen, wir möchten die Zeichenfolgenvariable needle in der Zeichenfolgenvariablen haystack suchen. Es gibt drei Fallstricke:

  1. Internationalisierte Anwendungen sollten string.toUpperCase und string.toLowerCase vermeiden. Verwenden Sie einen regulären Ausdruck, der stattdessen Groß- und Kleinschreibung ignoriert. Zum Beispiel var needleRegExp = new RegExp(needle, "i");, gefolgt von needleRegExp.test(haystack).
  2. Im Allgemeinen kennen Sie den Wert von needle möglicherweise nicht. Achten Sie darauf, dass needle keine regulären Ausdrücke Sonderzeichen enthält. Entkommen Sie diesen mit needle.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");.
  3. Wenn Sie in anderen Fällen needle und haystack genau übereinstimmen möchten, indem Sie die Groß- und Kleinschreibung ignorieren, müssen Sie unbedingt "^" am Anfang und "$" am Ende Ihres regulären Ausdruckskonstruktors 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);
18
Chris Chute

ES6 +:

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


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

includes() gibt true zurück, wenn searchString an einer oder mehreren Positionen erscheint oder false, ansonsten.

3
Andrey

Ich mag die Antwort von @ CHR15TO. Im Gegensatz zu anderen Antworten, die ich zu anderen ähnlichen Fragen gesehen habe, zeigt diese Antwort tatsächlich, wie der von einem Benutzer bereitgestellte Suchstring ordnungsgemäß zu entgehen ist (anstatt zu sagen, dass dies notwendig wäre, ohne zu zeigen, wie).

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

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

Wenn Sie sich Sorgen um den Fall "nicht abgeschlossene Zeichenklasse" machen, wäre das Entfernen aller nicht-alphanumerischen Zeichen hilfreich.

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

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

1
Steven Spungin

Es gibt zwei Möglichkeiten für den Vergleich zwischen Groß- und Kleinschreibung:

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

  2. Musterabgleich mit String-Methoden:

    Verwenden Sie die String-Methode "search" für die Suche nach Groß- und Kleinschreibung. __ Lesen Sie die Suchmethode und andere String-Methoden 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>
    
1
Sohail Arif

Sie können alles klein schreiben:

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