ajuda Regex para MediaWiki marcação template
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
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.