Pergunta

Eu tenho regex que foi muito bem, mas como ele CAMED fora não funciona bem em algumas situações

Mantenha olho na visualização de mensagens editor de mensagens causa fazer algumas coisas complicadas com "\"

[? \ [] [\ ^% # \ $ \ * @ \ -;] * [\ ^% # \ $ \ * @ \ -;.?] [\]]

sua tarefa é encontrar padrão que em geral parece assim

[ABA]

  • A - char set ^,%, #, $, *, @, - ,;
  • B - algum texto
  • [e] estão incluídos no padrão

é esperado para encontrar todas as ocorrências desse padrão na seqüência de teste

fox preto [# sample1 #] [% sample2%.] - [# sample3 #] come blocos

mas em vez de lista de espera de partidas

  • "[# sample1 #]"
  • "[% sample2%]"
  • "[# sample3 #]"

Recebo esta

  • "[# sample1 #]"
  • "[% sample2%]"
  • "- [# sample3 #]"

E parece que este problema irá ocorrer também com outros caracteres em conjunto "A". Então alguém poderia sugerir mudanças ao meu regex para fazê-lo funcionar como eu preciso?

e coisa menos importante, como fazer o meu regex para excluir padrões que se parecem com que

[ABC]

  • A - char set ^,%, #, $, *, @, - ,;
  • B - algum texto
  • C - char set ^,%, #, $, *, @, - ,; diferente de A
  • [e] estão incluídos no padrão

Por exemplo

[$ sample1 #] [% sample2 @] [% sample3;]

Agradecemos antecipadamente

MTH

Foi útil?

Solução

\[([%#$*@;^-]).+?\1\]

aplicado ao texto:

Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.

jogos

  • [#sample1#]
  • [%sample2%]
  • [#sample3#]
  • mas não [%sample4;]

Editar

Isso funciona para mim (saída como esperado, REGEX aceito pelo C # como esperado):

Regex re = new Regex(@"\[([%#$*@;^-]).+?\1\]");
string s = "Black fox [#sample1#] [%sample2%] - [#sample3#] [%sample4;] eats blocks.";

MatchCollection mc = re.Matches(s);
foreach (Match m in mc)
{
  Console.WriteLine(m.Value);
}

Outras dicas

Por que o primeiro "?" em "[[]?"

\[[\^%#\$\*@\-;].*?[\^%#\$\*@\-;]\]

seria detectar as diferentes cordas muito bem

Para ser mais preciso:

\[([\^%#\$\*@\-;])([^\]]*?)(?=\1)([\^%#\$\*@\-;])\]

detectaria [ABA]

\[([\^%#\$\*@\-;])([^\]]*?)(?!\1)([\^%#\$\*@\-;])\]

detectaria [ABC]

Você tem uma correspondência opcional do colchete de abertura:

[\]]?

Para a segunda parte de você pergunta (e talvez simplificar) tente o seguinte:

\ [\% [^ \%] + \% \] | \ [\ # [^ \ #] + \ # \] | \ [\ $ [^ \ $] + \ $ \]

Neste caso existe um padrão sub para cada possível delimitador. a | personagem é "OU", por isso vai corresponder se qualquer um dos 3 sub expressões corresponder.

Cada subexpression irá:

  • colchete de abertura
  • Char especial
  • Tudo o que não é um char especial (1)
  • caractere especial
  • Fechando backet

(1) pode precisar adicionar exclusões extras, como ']' ou '[' por isso não corresponde acidentalmente através de um grande corpo de texto como:

[% MyVar #] blá blá [$ outra_var%]

Rob

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