Dies ist sicherlich etwas, das viele Fallen hat. Ich habe mit Paolo Bergantinos Antwort gearbeitet und festgestellt, dass selbst das einige Einschränkungen hat. Ich fand die Arbeit mit Zeichenfolgendarstellungen von Daten ein guter Ort, um schnell einige der Hauptprobleme zu finden. Beginnen Sie mit einer Eingabezeichenfolge wie folgt:
'12-2-2019 5:1:48.670'
und richten Sie die Funktion von Paolo folgendermaßen ein:
function count(re, str) {
if (typeof re !== "string") {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
var cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}
Ich wollte, dass der reguläre Ausdruck übergeben wird, damit die Funktion wiederverwendbarer ist. Zweitens wollte ich, dass der Parameter eine Zeichenfolge ist, damit der Client den regulären Ausdruck nicht erstellen muss, sondern einfach mit der Zeichenfolge übereinstimmt eine Standard-String-Utility-Klassenmethode.
Hier können Sie sehen, dass ich Probleme mit der Eingabe habe. Mit den folgenden:
if (typeof re !== "string") {
return 0;
}
Ich bin sicher , dass die Eingabe nicht so etwas wie die wörtlichen 0
, false
, undefined
, oder null
, von denen keine Strings sind. Da diese Literale nicht in der Eingabezeichenfolge enthalten sind, sollte es keine Übereinstimmungen geben, aber es sollte übereinstimmen '0'
, was eine Zeichenfolge ist.
Mit den folgenden:
re = (re === '.') ? ('\\' + re) : re;
Ich habe es damit zu tun, dass der RegExp-Konstruktor (ich denke falsch) die Zeichenfolge '.'
als All-Character-Matcher interpretiert\.\
Da ich den RegExp-Konstruktor verwende, muss ich ihm das globale 'g'
Flag geben, damit alle Übereinstimmungen gezählt werden, nicht nur die erste, ähnlich wie in den Vorschlägen in anderen Posts.
Mir ist klar, dass dies eine extrem späte Antwort ist, aber es könnte hilfreich sein, wenn jemand hier entlang stolpert. Übrigens ist hier die TypeScript-Version:
function count(re: string, str: string): number {
if (typeof re !== 'string') {
return 0;
}
re = (re === '.') ? ('\\' + re) : re;
const cre = new RegExp(re, 'g');
return ((str || '').match(cre) || []).length;
}