2010-10-19 8 views
1

Je veux obtenir le nombre d'occurrences d'une sous-chaîne dans une chaîne. La chaîne est "hello hello hello". Je veux obtenir le nombre de fois "hello hello" se produit dedans, qui dans le cas ci-dessus est .
Quelqu'un peut-il m'aider s'il vous plaît à trouver une regex pour cela?Regex pour trouver le nombre de fois sous-chaîne "bonjour bonjour" se produit dans la chaîne "bonjour bonjour bonjour"

+5

Comment avez-vous ** 3 ** dans votre exemple? – Kobi

+0

Comment est-ce '3'? – codaddict

+0

Bonjour nouvel utilisateur. J'ai modifié votre question et nettoyé un peu. J'ai gardé "3" là, s'il vous plaît modifier si c'était une erreur, ou l'expliquer si ce n'était pas. Merci, et bienvenue à empiler le débordement. – Kobi

Répondre

2

En fonction de chaque que vous voulez compter le nombre d'occurrence de hello (qui est 3 dans votre exemple) ou hello hello (Wich est 2), vous pouvez faire:

#!/usr/bin/perl 
use 5.10.1; 
use warnings; 
use strict; 

my $str = q/hello hello hello/; 
my $count1 =()= $str =~ /(?=\bhello hello\b)/g; 
say $count1; # gives 2 

my $count2 =()= $str =~ /\bhello\b/g; 
say $count2; # gives 3 
2

Essayez:

(?=hello hello) 

L'utilisation d'un préanalyse vous permet de trouver des résultats qui se chevauchent. Pour mot entier, vous pouvez essayer:

\b(?=hello hello\b) 

Exemple: http://rubular.com/r/om1xn1FmBIles positions bleues marquent un match

1

En supposant que vous vouliez dire « bonjour » et non « bonjour bonjour », vous pouvez simplement diviser Bonjour. Pas besoin de construire regex supplémentaire

$string="hello hello blah hello blah helloworld hello blah blah hello"; 
@s = split "hello", $string, -1; 
print scalar @s - 1 ."\n"; #get size of array 
+1

Maintenant, je ne suis pas un type perl, mais n'est-ce pas/hello/'une regex? Dans ce cas, vous pourriez aussi bien faire face à cela. De plus, notez que la question porte sur '" bonjour bonjour "', ce qui suggère des correspondances qui se chevauchent. – Kobi

+0

Notez que/hello/est une regex, bien que :-) – Thilo

+0

@Kobi: +1. Alors que la division peut probablement être faite sans regex, le chevauchement serait un problème. – Thilo

0
use strict; 
use warning; 
my $str = "hello hello hello bla bla hello bla hello"; 
my $count = grep /hello/ , split /\s+/,$str ; 
print"$count"; #output 5 
+1

pourquoi diviser sur l'espace? – Thilo

+0

en fournissant plus de «solution générale» c'est-à-dire, d'abord en séparant la chaîne en mots et ensuite en vérifiant par 'grep' si c'est un mot requis ou non. –

+1

comment supposer que l'appariement doit seulement être fait sur les limites de mots plus générales? – Thilo