I'm versuchen, eine case-insensitive Suche mit zwei Zeichenfolgen in JavaScript arbeiten zu erhalten.
Normalerweise würde es wie folgt sein:
var string="Stackoverflow is the BEST";
var result= string.search(/best/i);
alert(result);
Das "/i"-Flag würde für die Unterscheidung von Groß- und Kleinschreibung stehen.
Aber ich muss nach einer zweiten Zeichenfolge suchen; ohne das Flag funktioniert es perfekt:
var string="Stackoverflow is the BEST";
var searchstring="best";
var result= string.search(searchstring);
alert(result);
Wenn ich das Flag /i
zum obigen Beispiel hinzufüge, würde es nach searchstring suchen und nicht nach dem, was in der Variable "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 dies erreichen?
Ja, verwenden Sie .match
und nicht .search
. Das Ergebnis des "match"-Aufrufs gibt die eigentliche Zeichenkette zurück, die gefunden wurde, kann aber trotzdem 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 regulären Ausdrucks ist wahrscheinlich die ordentlichste und naheliegendste Art, dies in JavaScript zu tun, aber bedenken Sie, dass es ein regulärer Ausdruck ist und daher Regex-Metazeichen enthalten kann. Wenn Sie die Zeichenkette von einer anderen Stelle nehmen wollen (z.B. Benutzereingabe), oder wenn Sie vermeiden wollen, eine Menge von Metazeichen zu escapen, dann verwenden Sie am besten indexOf
wie hier:
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');
}
Ersetzen Sie
var result= string.search(/searchstring/i);
durch
var result= string.search(new RegExp(searchstring, "i"));
Wenn Sie nur nach einer Zeichenkette und nicht nach einem komplizierteren regulären Ausdruck suchen, können Sie indexOf()
verwenden - aber denken Sie daran, beide Zeichenketten zuerst klein zu schreiben, da indexOf()
zwischen Groß- und Kleinschreibung unterscheidet:
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;
Angenommen, wir wollen die String-Variable Nadel
in der String-Variablen Haystack
finden.
Es gibt drei gotchas:
string.toUpperCase
und string.toLowerCase
vermeiden.
Verwenden Sie stattdessen einen regulären Ausdruck, der Groß-/Kleinschreibung ignoriert.
Zum Beispiel: var needleRegExp = new RegExp(needle, "i");
gefolgt von needleRegExpExp.test(haystack)
.Im allgemeinen kennen Sie den Wert von Nadel
möglicherweise nicht.
Achten Sie darauf, dass needle
keinen regulären Ausdruck [Sonderzeichen][1] enthält.
Vermeiden Sie diese mit neadle.replace(/[-[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
.
In anderen Fällen, wenn Sie Nadel
und Heuhaufen
genau übereinstimmen wollen, ignorieren Sie einfach die Groß-/Kleinschreibung und fügen Sie "^"
am Anfang und "$"
am Ende Ihres Konstruktors für reguläre Ausdrücke hinzu.
Unter Berücksichtigung der Punkte (1) und (2) wäre dies 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);
ES6+:
let string="Stackoverflow is the BEST";
let searchstring="best";
let found = string.toLowerCase()
.includes(searchstring.toLowerCase());
includes()
gibt wahr
zurück, wenn searchString
an einer oder mehreren Positionen erscheint oder andernfalls falsch
.
Mir gefällt die Antwort von @CHR15TO's, im Gegensatz zu anderen Antworten, die ich bei ähnlichen Fragen gesehen habe, zeigt diese Antwort tatsächlich, wie man einem vom Benutzer angegebenen Suchstring richtig entkommt (anstatt zu sagen, dass es notwendig wäre, ohne zu zeigen, wie).
Allerdings ist sie immer noch recht klobig und möglicherweise relativ langsam. Warum sollte man also nicht eine spezifische Lösung für das haben, was wahrscheinlich eine übliche Anforderung an Codierer ist? (Und warum sie nicht in die ES6-API 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);
Es gibt zwei Möglichkeiten für einen Vergleich ohne Berücksichtigung der Groß-/Kleinschreibung:
Zeichenketten in Großbuchstaben umwandeln und dann mit dem strikten Operator (====
) vergleichen.
Wie der strenge Operator Operanden behandelt, unter dem Sachen gelesen werden:
http://www.thesstech.com/javascript/relational-logical-operators
Mustervergleich mit String-Methoden:
Verwenden Sie das "search" String-Methode für die Suche ohne Berücksichtigung der Groß-/Kleinschreibung. Lesen Sie über Search und andere String-Methoden unter: http://www.thesstech.com/pattern-matching-using-string-methods
<!doctype html>
// 1. Weg
var a = "Apfel"; var b = "APPLE"; if (a.toOberKoffer() === b.toOberKoffer()) { alert("gleich"); }
//2. Weg
var a = " Null und ungültig"; dokument.schreiben(a.suchen(/null/i));
Ich mache das oft und benutze einen einfachen 5-zeiligen Prototyp, der Varargs akzeptiert. Er 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')
Mir ist aufgefallen, dass, wenn der Benutzer eine Textzeichenfolge eingibt, aber die Eingabe ohne Auswahl einer der Autovervollständigungsoptionen verlässt, kein Wert in der verborgenen Eingabe gesetzt wird, selbst wenn die Zeichenfolge mit einer im Array übereinstimmt. Also habe ich mit Hilfe der anderen Antworten dies 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 );
}
}