Wie führe ich eine Groß-/Kleinschreibung-ignorierende Zeichenfolgenvergleich in JavaScript durch?
Antworten
Zu viele Anzeigen?Da keine Antwort klar einen einfachen Code-Schnipsel für die Verwendung von RegExp
bereitgestellt hat, hier ist mein Versuch:
function compareInsensitive(str1, str2){
return typeof str1 === 'string' &&
typeof str2 === 'string' &&
new RegExp("^" + str1.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + "$", "i").test(str2);
}
Es hat einige Vorteile:
- Überprüft den Parameter-Typ (jeder nicht-String-Parameter, wie z.B.
undefined
, würde einen Ausdruck wiestr1.toUpperCase()
zum Absturz bringen). - Leidet nicht unter möglichen Internationalisierungsproblemen.
- Escaped den
RegExp
String.
Wie wäre es, KEINE Ausnahmen zu werfen und KEINE langsamen Regex zu verwenden?
return str1 != null && str2 != null
&& typeof str1 === 'string' && typeof str2 === 'string'
&& str1.toUpperCase() === str2.toUpperCase();
Der obige Codeausschnitt geht davon aus, dass Sie nicht übereinstimmen möchten, wenn entweder der String null oder undefiniert ist.
Wenn Sie null/undefiniert abgleichen möchten, dann:
return (str1 == null && str2 == null)
|| (str1 != null && str2 != null
&& typeof str1 === 'string' && typeof str2 === 'string'
&& str1.toUpperCase() === str2.toUpperCase());
Wenn Sie aus irgendeinem Grund zwischen undefiniert und null unterscheiden möchten:
return (str1 === undefined && str2 === undefined)
|| (str1 === null && str2 === null)
|| (str1 != null && str2 != null
&& typeof str1 === 'string' && typeof str2 === 'string'
&& str1.toUpperCase() === str2.toUpperCase());
Wenn Sie wissen, dass es sich um ASCII
-Text handelt, können Sie einfach einen Vergleich der Groß- und Kleinschreibung verschobener Zeichen verwenden.
Stellen Sie nur sicher, dass der String, mit dem Ihr "perfekter" String (der, mit dem Sie abgleichen möchten), in Kleinbuchstaben ist:
const CHARS_IN_BETWEEN = 32;
const LAST_UPPERCASE_CHAR = 90; // Z
function strMatchesIgnoreCase(lowercaseMatch, value) {
let i = 0, matches = lowercaseMatch.length === value.length;
while (matches && i < lowercaseMatch.length) {
const a = lowercaseMatch.charCodeAt(i);
const A = a - CHARS_IN_BETWEEN;
const b = value.charCodeAt(i);
const B = b + ((b > LAST_UPPERCASE_CHAR) ? -CHARS_IN_BETWEEN : CHARS_IN_BETWEEN);
matches = a === b // lowerA === b
|| A === b // upperA == b
|| a === B // lowerA == ~b
|| A === B; // upperA == ~b
i++;
}
return matches;
}