Pergunta

J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM
J0000010: Project name: E:\foo.pf
J0000011: Job name: MBiek Direct Mail Test
J0000020: Document 1 - Completed successfully

Eu tenho uma string gigante e feia e estou tentando extrair pedaços dela usando regex.

Nesse caso, quero pegar tudo depois de "Nome do Projeto" até a parte onde diz "J0000011:" (o 11 será um número diferente a cada vez).

Aqui está o regex com o qual estou brincando

Project name:\s+(.*)\s+J[0-9]{7}:

O problema é que ele não para até atingir o J0000020: no final.

Como faço para que a regex pare na primeira ocorrência de J[0-9]{7}?

Foi útil?

Solução

Fazer .* não ganancioso adicionando '?' depois disso:

Project name:\s+(.*?)\s+J[0-9]{7}:

Outras dicas

Usar quantificadores não gananciosos aqui é provavelmente a melhor solução, também porque é mais eficiente do que a alternativa gananciosa:As correspondências gananciosas geralmente vão o mais longe que podem (aqui, até o final do texto!) e então rastreiam caractere após caractere para tentar combinar a parte que vem depois.

No entanto, considere usar uma classe de caracteres negativos:

Project name:\s+(\S*)\s+J[0-9]{7}:

\S significa “tudo, exceto um espaço em branco e é exatamente isso que você deseja.

Bem, ".*" é um seletor ganancioso.Você o torna não ganancioso usando ".*?" Ao usar a última construção, o mecanismo regex irá, a cada passo, combinar o texto com o "." tentar corresponder a qualquer coisa que venha depois do ".*?".Isto significa que se, por exemplo, nada vier depois do ".*?", então não corresponde a nada.

Aqui está o que eu usei. s contém sua string original.Este código é específico do .NET, mas a maioria dos tipos de regex terá algo semelhante.

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;

Eu também recomendo que você experimente expressões regulares usando "Expresso" - é um utilitário excelente (e gratuito) para edição e teste de regex.

Uma de suas vantagens é que sua IU expõe muitas funcionalidades de regex com as quais pessoas não experientes em regex podem não estar familiarizadas, de uma forma que seria fácil para elas aprenderem esses novos conceitos.

Por exemplo, ao construir seu regex usando a UI e escolher "*", você pode marcar a caixa de seleção "O menor número possível" e ver o regex resultante, bem como testar seu comportamento, mesmo se não estiver familiarizado com expressões não gananciosas antes.

Disponível para download no site:http://www.ultrapico.com/Expresso.htm

Download expresso:http://www.ultrapico.com/ExpressoDownload.htm

(Nome do projeto:\s+[A-Z]:(?:\\w+)+.[a-zA-Z]+\s+J[0-9]{7})(?=:)

Isso funcionará para você.

Adicionar (?:\\w+)+.[a-zA-Z]+ será mais restritivo em vez de .*

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top