O Regex está combinando todas as combinações

1

Eu tenho o seguinte texto abaixo. Como escrevo o regex para capturar todo o texto relacionado a REQ_XXX ?

Esta é minha expressão .*(REQ_.*)\| , mas captura |3 |4 |5 . Eu só quero que ele pare após o primeiro | que ele vê.

    
por user3719021 21.09.2017 / 19:35

4 respostas

2

Você pode usar:

.*(REQ_[^|]*)\|

O "|" caractere será excluído.

    
por 21.09.2017 / 20:25
2

Editar:

.*(REQ_.*?)\|

O truque é ? informar ao anterior.* para parar o mais cedo possível. Dessa forma, o primeiro | que segue termina o escopo de .* . Isso é exatamente o que você quer.

Minha resposta antiga está abaixo. Funciona bem, mas acho que o acima é o caminho certo.

Resposta antiga:

.* corresponde (quase) tudo, incluindo | . Use [^|\n]* para corresponder a tudo, exceto | e nova linha.

.*(REQ_[^|]*)\|

\n é necessário porque o [^|]* puro pode se estender por várias linhas. Eu acho que você não quer isso.

    
por 21.09.2017 / 20:23
1

Algumas das soluções já estão postadas em outras respostas, estou dando um resumo aqui.

Você pode seguir várias abordagens aqui, você precisa decidir com base nas suas necessidades qual delas usar:

  1. forneça uma lista positiva de caracteres no seu código:
    .*(REQ_[\w]+)[\s]*\|
    • neste caso [\w]+ corresponde a todos os caracteres da palavra (letras, números e "_")
    • espaços em branco antes de | não estarem incluídos no resultado capturado ( [\s]* está fora dos colchetes)
  2. forneça uma lista negativa de caracteres em que você deseja que sua regex pare:
    .*(REQ_[^|]+)\|
  3. use correspondência lenta para parar na primeira possibilidade: %código%
por 22.09.2017 / 06:27
0

Se REQ_ for sempre seguido por caracteres de palavras, você pode simplesmente usar REQ_w+ ou, se não quiser corresponder a ABCREQ_123 , use a limite de palavras : \bREQ_\w+ .

Veja em ação

    
por 27.09.2017 / 10:38

Tags