2012-01-06 11 views

Respuesta

4

Una opción sencilla es la siguiente (utilizando el indicador de varias líneas y no DOT-todo):

^(?!.*\bhello\b.*\bhello\b).*\bhello\b.*$ 

En primer lugar, comprobar no tiene 'hola' dos veces, y luego se echa tenerlo al menos una vez.
Hay otras maneras de verificar lo mismo, pero creo que este es bastante simple.

Por supuesto, puede hacer coincidir simple para \bhello\b y contar el número de coincidencias ...

+0

¿Por qué no solo lo encuentra una vez y comprueba que no exista más después de eso? Parece un poco menos repetitivo de esa manera. – Wiseguy

+1

@Wiseguy - Un patten como '^. * Hello (?!. * Hello)' no funcionaría, porque siempre coincidirá con el último 'hello' de la línea. Necesitarías algo como '^ (? :(?! hello).) * Hello (?!. * Hello)', que no es mucho más elegante. Puede que me haya perdido algo simple ... – Kobi

+0

@Wiseguy - no. El motor de expresiones regulares intenta hacer coincidir, para no fallar. Puede coincidir, por lo que lo hará. – Kobi

1

Dado que sólo estás preocupado por las palabras (es decir, símbolos separados por espacios en blanco), sólo puede dividir en espacios y ver con qué frecuencia aparece "hello". Dado que usted no mencionó una lengua, he aquí una aplicación en Perl:

use strict; 
use warnings; 

my $a1="ehello goodbye hellot hello goodbye"; 
my $a2="ehello goodbye hello hello goodbye"; 

my @arr1=split(/\s+/,$a1); 
my @arr2=split(/\s+/,$a2); 

#grab the number of times that "hello" appears 

my $num_hello1=scalar(grep{$_ eq "hello"}@arr1); 
my $num_hello2=scalar(grep{$_ eq "hello"}@arr2); 

print "$num_hello1, $num_hello2\n"; 

La salida es

1, 2 
2

una expresión regular genérica sería:

^(?:\b(\w+)\b\W*(?!.*?\b\1\b))*\z 

Altho que podría ser más limpio para invertir el resultado de este partido:

\b(\w+)\b(?=.*?\b\1\b) 

Esto funciona haciendo coincidir una palabra y capturándola, luego asegurándose con una búsqueda anticipada y una retro-referencia que no sigue o sigue en ninguna parte de la cadena.

+0

Doh, leí mal la pregunta, pensé "hola" podría ser cualquier palabra, y el propósito de la expresión regular era asegurarme de que no se repita ninguna palabra. Dejará la respuesta en caso de que sea de interés para alguien. – Qtax

Cuestiones relacionadas