1331 Stimmen

Wie vergleicht man Zeichenfolgen ohne Groß-/Kleinschreibung?

Wie führe ich eine Groß-/Kleinschreibung-ignorierende Zeichenfolgenvergleich in JavaScript durch?

2voto

Luca C. Punkte 9744

Wandeln Sie beide in Kleinbuchstaben um (nur einmal aus Leistungsgründen) und vergleichen Sie sie mit einem Inline-Ternäroperator:

function strcasecmp(s1,s2){
    s1=(s1+'').toLowerCase();
    s2=(s2+'').toLowerCase();
    return s1>s2?1:(s1

2voto

Jhankar Mahbub Punkte 9404

Ich habe eine Erweiterung geschrieben. Sehr trivial

if (typeof String.prototype.isEqual!= 'function') {
    String.prototype.isEqual = function (str){
        return this.toUpperCase()==str.toUpperCase();
     };
}

1voto

Ohad Schneider Punkte 34748

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:

  1. Überprüft den Parameter-Typ (jeder nicht-String-Parameter, wie z.B. undefined, würde einen Ausdruck wie str1.toUpperCase() zum Absturz bringen).
  2. Leidet nicht unter möglichen Internationalisierungsproblemen.
  3. Escaped den RegExp String.

1voto

Ben Wilde Punkte 5244

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

1voto

matsko Punkte 21357

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X