2012-06-14 25 views
5

buscando un perl de una sola línea lo que va a encontrar todas las palabras con el siguiente patrón:palabras búsqueda de cualquiera caracteres repetidos

X(not_X_chrs)X(not_X_chrs)X e.g. cyclic 

para un carácter, es fácil, por ejemplo, para 'a'

perl -nle 'print if /^a[^a]+a[^a]+a$/' < /usr/share/dict/web2 

pero quiero buscar CUALQUIER carácter, por lo que, en busca de una expresión regular para encontrar todos palabras como:

azalea #repeating a 
baobab #repeating b 
cyclic #c 

y así sucesivamente ..

intenté esto:

perl -nle 'print if m/^([a-z])[^$1]+$1[^$1]+$1$/i' </usr/share/dict/web2 

pero no funciona.

Respuesta

6
(?:(?!STRING).) 

es

(?:STRING) 

como

[^CHAR] 

es

CHAR 

lo que podría utilizar

/ 
^
    (\pL) 
    (?: 
     (?:(?!\1).)+ 
     \1 
    ){2} 
    \z 
/sx 
3

Esta es la mejor expresión regular que podía llegar a:

^([a-z])((?:(?!\1).)+\1){2}$ 

probado en RegexPal.

0

También es posible usar un cuantificador perezoso con un grupo de no dar marcha atrás atómica:

^(\w)(?>\w*?\1){2}$ 

Altho que sólo funciona cuando 0 caracteres intermedios es aceptable.

Con al menos 1 carácter que tendría que utilizar una búsqueda negativa hacia delante:

^(\w)(?>(?!\1)\w+?\1){2}$ 
0

En perlretut se dice que se puede retro-referencia en una expresión regular (no la parte derecha de una sustitución) utilizando \g1. Esto fue cambiado en 5.14. Como solo tengo 5.12.2 aquí, tengo que usar \1.

Por lo tanto, su expresión regular original con una pequeña adjustion trabajó para mí:

use strict; use warnings; 
use 5.12.2; 
use feature qw(say); 
for (qw/ azalea baobab cyclic deadend teeeeeestest doesnotwork /) { 
    say if m/^([a-z])[^\1]+\1[^\1]+\1$/i; 
} 

Mirándolo con YAPE::Regex::Explain

use YAPE::Regex::Explain; 
print YAPE::Regex::Explain->new(qr/^([a-z])[^\1]+\1[^\1]+\1$/i)->explain(); 

rendimientos:

The regular expression: 

(?i-msx:^([a-z])[^\1]+\1[^\1]+\1$) 

matches as follows: 


use YAPE::Regex::Explain; 
print YAPE::Regex::Explain->new(qr/^([a-z])[^\1]+\1[^\1]+\1$/i)->explain(); 

NODE      EXPLANATION 
---------------------------------------------------------------------- 
(?i-msx:     group, but do not capture (case-insensitive) 
         (with^and $ matching normally) (with . not 
         matching \n) (matching whitespace and # 
         normally): 
---------------------------------------------------------------------- 
^      the beginning of the string 
---------------------------------------------------------------------- 
    (      group and capture to \1: 
---------------------------------------------------------------------- 
    [a-z]     any character of: 'a' to 'z' 
---------------------------------------------------------------------- 
)      end of \1 
---------------------------------------------------------------------- 
    [^\1]+     any character except: '\1' (1 or more 
          times (matching the most amount possible)) 
---------------------------------------------------------------------- 
    \1      what was matched by capture \1 
---------------------------------------------------------------------- 
    [^\1]+     any character except: '\1' (1 or more 
          times (matching the most amount possible)) 
---------------------------------------------------------------------- 
    \1      what was matched by capture \1 
---------------------------------------------------------------------- 
    $      before an optional \n, and the end of the 
          string 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 

Editar: Su one-liner por lo tanto es perl -e 'print if m/^([a-z])[^\1]+\1[^\1]+\1$/i'.

Por otro lado, si se hubiera tratado perl -w -e 'print if m/(as)$1/' Habrías visto su problema inmediato:

$ perl -w -e 'print if m/(a)$1/' asdf 
Use of uninitialized value $1 in regexp compilation at -e line 1. 
Use of uninitialized value $_ in pattern match (m//) at -e line 1. 

Lo que no he descubierto es la razón de que coincide ololololo.

Cuestiones relacionadas