Número de ocorrências de uma substring em uma string

Quantas vezes uma string aparece dentro de outra string

Enquanto as Unit SysUtils e StrUtils contem centenas de rotinas para manipulação de strings, há sempre algo que está “faltando”,  uma função que se usa quase que diariamente, que retorne quantas vezes um string aparece dentro de outra string.

Aqui está um exemplo: no caminho “C:\Programs\MyApp\Source\Main” qual o nível da pasta “Main” – quantas vezes o carácter “\” (separador de pastas) aparece no caminho?

Uma solução seria a criação da função SubStringOccurrences:

uses StrUtils;

//case sensitive occurrence counter
function SubStringOccurences( const subString, sourceString : string) : integer;
var
pEx: integer;
begin
result := 0;
pEx := PosEx(subString, sourceString, 1);
while pEx <> 0 do
begin
Inc(result);
pEx := PosEx(subString, sourceString, pEx + Length(subString));
end;
end;

Para o caminho apresentado anteriormente, SubStringOccurrences retornará 4, isto é “\” aparece 4 vezes em  “C:\Programs\MyApp\Source\Main”.
Você precisa adicionar a Uses StrUtils para usar a função PosEx. A função PosEx retorna um valor inteiro especificando a posição da ocorrencia de uma string dentro de outra, onde nossa pesquisa começará.

Ao chamar PosEx em uma repetição do tipo while (enquanto há ocorrência) nós pegamos o número de ocorrências de uma string dentro de outra string.

Note que SubStringOccurrences e PosEx são case sensitive, diferencia maiúsculas de minúsculas. SubStringOccurrences(‘A’,’abracadabra’) retornará 0(zero), enquanto SubStringOccurrences(‘a’,’abracadabra’) retornará 5.

Uma função SubStringOccurrences sem case sensitive seria assim:

uses StrUtils;

function SubStringOccurences( const subString, sourceString : string; caseSensitive : boolean) : integer;
var
pEx: integer;
sub, source : string;
begin
if caseSensitive then
begin
sub := subString;
source := sourceString;
end
else
begin
sub := LowerCase(subString);
source := LowerCase(sourceString);
end;

result := 0;
pEx := PosEx(sub, source, 1);
while pEx <> 0 do
begin
Inc(result);
pEx := PosEx(sub, source, pEx + Length(sub));
end;
end;

Finalizando, se você precisa substituir todas as ocorrências de uma string dentro de outra string, você pode usar a função StringReplace.

 

Transcrição do site: [http://delphi.about.com/od/delphi-tips-2011/qt/number-of-occurrences-sub-string-within-string-delphi.htm]

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: