Pergunta

As minhas habilidades regex são muito pobres, e na maioria das vezes eles me fazem sentir estúpido. Alguém pode ajudar?

Esta questão está mais preocupado com melhor domínio de regex que o trabalho de extrair informações de sopa de lama, por isso, se o meu entendimento do sistema de templates MediaWiki é falho, eu realmente não me importo muito. Eu vou identificá-lo em breve.

Eu sou analisar MediaWiki marcação, e eu estou tentando agarrar nomes de modelos MediaWiki. Estes denotado por algo como:

{{Nome do modelo | outras coisas

ou

{{Nome do modelo}}

Se um # segue imediatamente as chaves:

{{# Outra coisa

Eu gostaria de ignorá-lo.

Então ...

Eu gostaria de combinar 2 chaves {{não seguido por #-se até a próxima ocorrência de qualquer | (Tubo) ou}} (2 curlies fecho)

Assim:

{{eu sou um sapo | algumas outras coisas jogo

{{# Eu sou um sapo | algumas outras coisas falha

lixo aqui {{}} Macaco bla bla jogo

lixo aqui {{# Macaco}} bla bla falha

etc ...

As tampas seguinte regex isso (eu acho):

\{{2}(?!\#)(.*?)(?:\||\}\})

mas também coincide com:

algumas coisas aqui {{{Giraffe | oijq

Como posso fazê-lo falhar se não há exatamente 2 abertura chaves?

EDIT: .net regex, btw

Foi útil?

Solução

Você provavelmente vai querer usar um negativo lookbehind de largura zero / frente afirmação

lookbehind tem o mesmo efeito, mas funciona para trás. Conta a regex motor temporariamente para trás passo na seqüência, para verificar se o texto dentro do lookbehind podem ser combinados lá. (?<!a)b corresponde a um "b" que é não precedida por um "a", utilizando o negativo olhar para trás. Ele não irá corresponder "cab", mas irá coincidir com a b (e somente a b) em "Cama" ou "dívida". (?<=a)b (positiva lookbehind) corresponde a b (e apenas a b) na cabine, mas não corresponde cama ou dívida.

Assim:

(?<!\{)\{{2}?(?!\#)(.*?)(?:\||\}\})

A outra questão que eu só notei, o (.*?) corresponde ao terceiro encaracolado ... Em vez disso, tente adicionar o terceiro encaracolados ao negativo LookAhead você está usando para # já

(?<!\{)\{{2}(?!\{*\#|\{+)(.*?)(?:\||\}\})

Outras dicas

(?<!\{)\{{2}(?!\#)(.*?)(?:\||\}\})

O de largura zero negativo olhar-behind

(?<!\{)

corresponde apenas a uma posição que não é directamente depois de uma chaveta.

A talvez wau hackish seria basicamente fazer um OR NOT com repetiu o mesmo padrão regex, exceto fazê-lo coincidir 3 ou mais encaracolados chaves. Provavelmente não é a solução mais elegante embora. Boa sorte.

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