Zephyrnet-logo

JavaScript: het aantal subtekenreeksen in een tekenreeks tellen

Datum:

Introductie

Wanneer u met strings of grote hoeveelheden tekst werkt, zult u waarschijnlijk situaties tegenkomen waarin u moet tellen hoe vaak een specifieke substring binnen een andere string is voorgekomen.

In dit artikel bekijken we hoe u JavaScript kunt gebruiken om het aantal subtekenreeksen in een tekenreeks te tellen. We zullen kijken naar de verschillende benaderingen en methoden om dat aantal te verkrijgen.

Maar voordat we beginnen, laten we eerst definiëren wat een substring is.

Wat is een substring?

A deelstring is een duidelijk gedefinieerde reeks opeenvolgende tekens in een string. Als we bijvoorbeeld de string "Mijn naam is John Doe", dan "naam is" is een subtekenreeks, maar "is naam" is niet omdat het niet langer een opeenvolgende reeks is (we hebben de volgorde van woorden veranderd). Individuele woorden zoals "is" en "Naam" zijn altijd substrings.

Opmerking: "Je naam is Jo" is een geldige substring van de "Mijn naam is John Doe" ook. Met andere woorden, substrings zijn niet altijd hele woorden, ze kunnen veel minder leesbaar zijn.

Er zijn veel manieren om dit in JavaScript te bereiken, maar twee belangrijke methoden zijn: split() methode en normale uitdrukkingen.

Tel het aantal substrings in String With splitsen () Methode

De split() is een JavaScript-methode voor het splitsen van strings in een array van substrings met behoud van de originele string. Deze methode accepteert a afscheider en scheidt een string op basis daarvan. Als er geen scheidingsteken is meegeleverd, is de split() retourneert een array met slechts één element - de originele string.

Opmerking: Waarschijnlijk het meest voor de hand liggende voorbeeld van het scheidingsteken is de lege ruimte. Wanneer u het opgeeft als scheidingsteken voor de split() methode, wordt de originele string opgedeeld wanneer er een spatie voorkomt. Daarom, de split() methode zal een array van individuele woorden uit de originele string teruggeven.

In dit artikel gebruiken we een handige truc om het aantal keren dat een subtekenreeks in een tekenreeks voorkomt te achterhalen. We stellen de subtekenreeks in als scheidingsteken in de split() methode. Op die manier kunnen we het aantal keren dat de subtekenreeks voorkomt extraheren uit de array die de split() methode geretourneerd:

let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";
let mySubString = "orange";

let count = myString.split(mySubString).length - 1;
console.log(count);

De bovenstaande code is geretourneerd 3, Maar de myString heeft slechts één instantie van de tekenreeks "Oranje". Laten we eens kijken wat er is gebeurd door de array te onderzoeken die is gemaakt nadat we de originele string hebben gesplitst met de "Oranje" als scheidingsteken:

console.log(myString.split(mySubString));

Dit geeft ons:

['John Doe has 5 ', 's which Jane Doe has only 2 ', 's, Jane gave Mike 1 of her ', ' so she is now left with only 1 Orange.']

Kortom, de split() methode heeft alle exemplaren van de tekenreeks verwijderd "Oranje" van de originele tekenreeks en sneed deze in die plaatsen waar de subtekenreeks werd verwijderd.

Opmerking: Merk op hoe dat van toepassing is op de string "oranjes” - De "Oranje" is de substring, daarom split() verwijdert "Oranje" en laat ons alleen met "S".

Sinds we hebben gevonden drie gebeurtenissen van de string "Oranje", de originele snaar werd op drie plaatsen gesneden - daarom hebben we geproduceerd vier substrings. Daarom moeten we aftrekken 1 van de arraylengte wanneer we het aantal keren dat de subtekenreeks voorkomt berekenen.

Dat is allemaal goed, maar er is er nog één oranje in de originele string – het laatste woord is "Oranje". Waarom hebben we het niet geteld in het vorige voorbeeld? Dat komt omdat de split() methode is hoofdlettergevoelig, daarom beschouwt het "Oranje" en "Oranje" als verschillende elementen.

Als u uw code moet maken hoofdlettergevoelig, zou een goede oplossing zijn om eerst de hele tekenreeks en subtekenreeks naar een bepaalde tekst te converteren voordat u controleert op voorvallen:

let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";
let mySubString = "ORANGE";

let myStringLC = myString.toLowerCase();
let mySubStringLC = mySubString.toLowerCase();

let count = myStringLC.split(mySubStringLC).length - 1;
console.log();

Bovendien is het laatste wat we kunnen doen onze code herbruikbaar te maken door deze in te pakken met een functie:

const countOccurence = (string, word) => {
    let stringLC = string.toLowerCase();
    let wordLC = word.toLowerCase();

    let count = stringLC.split(wordLC).length - 1;

    return count
};

Tel het aantal substrings in String met RegEx

Een andere methode om het aantal keren te tellen, is door gebruik te maken van normale uitdrukkingen (RegEx). Het zijn patronen van tekens die worden gebruikt om tekenreeksen te zoeken, matchen en valideren. Waarschijnlijk de meest voorkomende use-case voor reguliere expressies is: formulier validatie – controleren of de string een (geldig) e-mailadres, een telefoonnummer, enz. is. Maar in dit artikel zullen we het gebruiken om het aantal voorkomens van een substring in een string te tellen.

Als je meer wilt weten over reguliere expressies in JavaScript, moet u onze uitgebreide gids lezen - "Gids voor reguliere expressies en bijpassende strings in JavaScript".

Allereerst moeten we een reguliere expressie definiëren die overeenkomt met de substring die we zoeken. Ervan uitgaande dat we het aantal keren dat de string voorkomt willen vinden "Oranje" in een grotere string ziet onze reguliere expressie er als volgt uit:

let regex = /orange/gi;

Bekijk onze praktische, praktische gids voor het leren van Git, met best-practices, door de industrie geaccepteerde normen en bijgevoegd spiekbriefje. Stop met Googlen op Git-commando's en eigenlijk leren het!

In JavaScript schrijven we een patroon voor reguliere expressies tussen twee schuine strepen - /pattern/. Optioneel kunt u na de tweede schuine streep een lijst plaatsen met: vlaggen – speciale tekens die worden gebruikt om het standaardgedrag af te wisselen bij het matchen van patronen.

Reguliere expressies komen bijvoorbeeld standaard alleen overeen met het eerste exemplaar van het patroon in een zoekreeks. Matching is ook hoofdlettergevoelig, wat misschien niet is wat we willen bij het zoeken naar substrings. Daarom introduceren we twee vlaggen die we voor dit artikel zullen gebruiken:

  • g – zorgt ervoor dat we krijgen allen voorkomens van het patroon (niet alleen de eerste)
  • i – zorgt ervoor dat matching is hoofdlettergevoelig

Opmerking: Op basis van uw behoeften kunt u kiezen welke vlaggen u gaat gebruiken. Deze zijn niet verplicht.

Laten we nu een eerder gemaakte reguliere expressie gebruiken om het aantal keren dat de tekenreeks voorkomt te tellen "Oranje" in de myString:

let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";

let regex = /orange/gi;
let count = (myString.match(regex) || []).length;

console.log(count);

Opmerking: We hebben toegevoegd || [] in retourneert een lege array als er geen overeenkomst is. Daarom wordt het aantal keren ingesteld op 0.

Als alternatief kunnen we de RegExp() constructor om een ​​reguliere expressie te maken. Het accepteert een zoekpatroon als het eerste argument en markeert als het tweede:

let myString = "John Doe has 5 oranges while Jane Doe has only 2 oranges, Jane gave Mike 1 of her orange so she is now left with only 1 Orange.";

let regex = new RegExp("orange", "gi");
let count = (myString.match(regex) || []).length;

console.log(count);

Bovendien kunnen we dit herbruikbaar maken door het in een aparte functie te verpakken:

let countOcurrences = (str, word) => {
	var regex = new RegExp(word, "gi");
	let count = (str.match(regex) || []).length;
	return count;
};

Strikt overeenkomende exacte zinnen

Soms wil je matchen voor een strikte zin of woord - zodat "sinaasappels" is niet opgenomen in uw tellingen, of enig woord dat wel "Oranje" op zich, maar is niet strikt "Oranje". Dit is een meer specifiek geval van zoeken naar strings binnen strings, en is gelukkig vrij eenvoudig!

let regex = /WorangeW/gi;

Door onze termijn binnen te wikkelen W W, we matchen strikt voor "Oranje" (hoofdlettergevoelig) en deze regex zou maar twee keer overeenkomen in onze zin (beide "sinaasappels" komen niet overeen).

Benchmarking van prestaties

Wanneer we beide methoden uitvoeren met behulp van de JS-benchmark, zal de split-methode altijd sneller uitkomen dan de regex-methode, hoewel dit niet echt merkbaar is, zelfs niet voor vrij grote tekstcorpora. U zult waarschijnlijk beide goed gebruiken.

Opmerking: Vertrouw niet op deze benchmarks als uw uiteindelijke beslissing. Test ze in plaats daarvan zelf om te bepalen welke het beste past bij uw specifieke gebruik.

Conclusie

In dit artikel leerden we over twee standaardmethoden voor het berekenen van het aantal keren dat substrings in een string voorkomen. We hebben de resultaten ook gebenchmarkt, waarbij we opmerken dat het niet echt uitmaakt welke aanpak je kiest, zolang het maar voor je werkt.

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?