regex para corresponder identificadores sem duplo _

2

Eu quero que uma regex corresponda a identificadores com letras, dígitos e _ , sem sublinhados duplos. Minha tentativa atual:

^(?!_)(?!.*?_$)[a-zA-Z][a-zA-Z0-9_]+$

Exemplo:

Abdfsdfsdf__ 
1B2345_
v1__23456
__23456789b
12345-6789
123456789
1_fsdfdfsdf
v_fsdfsdf_fsdfd
v_123
v__123
v134234_fsdfsd
123456
a1b2c3d4e5

Correspondido:

v1__23456
v_fsdfsdf_fsdfd
v_123
v__123
v134234_fsdfsd
a1b2c3d4e5

Como posso remover as linhas v1__23456 e v__123 das correspondências?

    
por cheng6588 06.06.2013 / 10:18

4 respostas

1
^(?!_)           # don't start with _
(?!.*?_$)        # don't end with _
[a-zA-Z]         # the first character must be a letter
[a-zA-Z0-9_]+$   # after that digits and underscores are ok

Você expressou de duas maneiras diferentes que o primeiro caractere não deve ser _ , mas nada aqui diz nada sobre __ no meio.

Usando uma visão negativa, é simples expressar "um ou mais caracteres alfanuméricos ou _ , não comece com _ ou um dígito, não termine com _ e não permita __ anywhwere ”:

^(?![0-9_]|.*__.*_$|)[0-9A-Z_a-z]+$

Sem lookahead negativo (por exemplo, em awk ou grep -E ), você pode dividir as partes:

^[A-Za-z][0-9A-Za-z]*(_[0-9A-Za-z]+)*$

Comece com uma letra, depois zero ou mais alfanuméricos, então você pode ter sublinhados, mas cada um deve ser seguido por um ou mais alfanuméricos.

    
por 07.06.2013 / 03:06
0

Existe uma maneira de fazer isso:

perl -nle 'print if /(_)*.*/' pattern.txt

Resposta:

1B2345_
12345-6789
123456789
1_fsdfdfsdf
v_123
v134234_fsdfsd
123456
a1b2c3d4e5

A regex /(_)*.*/ corresponderá a todas as linhas com dois ou mais sublinhados _ . Apenas negue a condição para imprimir linhas que não combinem.

    
por 06.06.2013 / 10:38
0

Você quer encontrar linhas que NÃO contenham dois sublinhados consecutivos? A menos que eu esteja sentindo falta de algo, isso deve funcionar:

    grep -v '__'

ou para remover linhas que contenham qualquer número de sublinhados consecutivos:

    grep -v '__*'

ou para remover linhas que contenham vários sublinhados adjacentes, mas mantenha linhas que contenham apenas sublinhados únicos:

    grep -v '___*'
    
por 06.06.2013 / 23:02
0
$ grep -E '^(_?[A-Za-z0-9])*[A-Za-z](_?[A-Za-z0-9])*$' example.txt
1_fsdfdfsdf
v_fsdfsdf_fsdfd
v_123
v134234_fsdfsd
a1b2c3d4e5
    
por 07.06.2013 / 03:59