Policz liczbę dopasowań wyrażenia regularnego w JavaScript
Chciałem napisać wyrażenie regularne, aby policzyć liczbę spacji/tabulatorów/nowej linii w fragmencie tekstu. Więc naiwnie napisałem: -
numSpaces : function(text) {
return text.match(/\s/).length;
}
Z jakiegoś nieznanego powodu zawsze zwraca
1. Jaki jest problem z powyższym stwierdzeniem? Od tego czasu rozwiązałem ten problem w następujący sposób: -
numSpaces : function(text) {
return (text.split(/\s/).length -1);
}
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
6 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
tl; dr: ogólny licznik wzorców
Dla tych, którzy przybyli tutaj i szukają ogólnego sposobu zliczania liczby wystąpień wzorca wyrażenia regularnego w ciągu znaków i nie chcą, aby to się nie powiodło, jeśli wystąpi zero, ten kod jest tym, czego potrzebujesz. Oto demo:
<div class="snippet-code">
<div class="snippet" data-babel="false" data-console="true" data-hide="false" data-lang="js">
<pre class="snippet-code-js lang-js prettyprint-override">
oryginalna odpowiedź
Problem z oryginalnym kodem polega na tym, że go brakuje
identyfikator globalny
http://www.javascriptkit.com/jsref/regexp.shtml
:
Bez części wyrażenia regularnego dopasuje tylko pierwsze wystąpienie i na tym zakończy.
Pamiętaj również, że Twoje wyrażenie regularne będzie liczyć dwa razy następujące po sobie spacje:
Jeśli nie jest to pożądane, możesz to zrobić:
Anonimowy użytkownik
Potwierdzenie od:
moja poprzednia odpowiedź
https://stackoverflow.com/a/23385429/1338292, możesz użyć https://developer.mozilla.org/ ... /exec
iterować po wszystkich dopasowaniach i liczyć każde wystąpienie; Zaleta jest ograniczona tylko pamięcią, ponieważ ogólnie jest około 20% wolniejsza niż użycie https://developer.mozilla.org/ ... match
.
Anonimowy użytkownik
Potwierdzenie od:
Oparte na
https://stackoverflow.com/a/48195124/16777
https://stackoverflow.com/a/48195124/16777
ale ustalone dla prawdziwej pracy w przypadku zerowych wyników.
Anonimowy użytkownik
Potwierdzenie od:
('my string'.match(/\s/g) || []).length;
Anonimowy użytkownik
Potwierdzenie od:
Chciałem, aby wyrażenie regularne zostało przekazane, aby funkcja była bardziej przydatna do ponownego użycia, po drugie, chciałem, aby parametr był ciągiem, aby klient nie musiał wykonywać wyrażenia regularnego, ale po prostu dopasował ciąg, jak standardowa metoda narzędzia do ciągów klasa.
Teraz tutaj widać, że mam do czynienia z problemami z danymi wejściowymi. Korzystając z następujących środków:
Gwarantuję, że dane wejściowe nie mają nic wspólnego z literałami , , lub , żaden z który nie jest ciągiem. Ponieważ te literały nie są częścią ciągu wejściowego, nie powinno być żadnych dopasowań, ale muszą one pasować do , który jest ciągiem.
Korzystając z następujących środków:
Mam do czynienia z faktem, że konstruktor RegExp (myślę źle) zinterpretuje wiersz jako All character matcher Wreszcie, ponieważ używam konstruktora RegExp, muszę nadać mu globalną flagę , aby uwzględniał wszystkie dopasowania, a nie tylko pierwsze, jak sugestie w innych postach.
Zdaję sobie sprawę, że to bardzo późna odpowiedź, ale może być pomocna dla kogoś, kto się tu potyka. BTW tutaj jest wersja TypeScript:
Anonimowy użytkownik
Potwierdzenie od: