Como posso analisar minha String usando expressão regular para obter apenas determinado número de correspondências? [fechadas]

0

Atualmente, estou usando essa expressão regular a seguir para dividir minha String em grupos.

^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$

Pty[R=4]@ID

Estou recebendo quatro grupos

1) Pty
2) [R=4]
3) R=4
4) ID

Mas preciso de apenas três grupos

1) Pty
2) R=4
3) ID

Esta expressão regular também deve ser capaz de aceitar Pty @ ID para obter dois grupos

1) Pty
2) ID

Como posso conseguir isso?

    
por would_like_to_be_anon 27.08.2014 / 21:45

1 resposta

1

Você não especifica nenhuma ferramenta, então eu uso perl como exemplo:

$ echo Pty[R=4]@ID | perl -nle '
    print "$1\n$2\n$3\n$4"
        if /^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty
[R=4]
R=4
ID

$ echo Pty@ID | perl -nle '
    print "$1\n$2\n$3\n$4"
        if /^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty


ID

Com o grupo de captura de expressões regulares, você pode usar referências anteriores para obter as correspondências anteriores. Em perl , você pode usar $1 , $2 , ..., $n .

No seu caso, você pode usar um grupo sem captura para evitar que [R=4] seja capturado:

$ echo Pty[R=4]@ID |
perl -nle '
    print "$1\n$2\n$3"
        if /^([a-zA-Z0-9]*)(?:\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty
R=4
ID

Como você mencionou php em seu comentário, você pode usar backreference do php sintaxe ou \g1 ou \g{1} .

    
por 27.08.2014 / 21:51