Eu tenho problema com ajuste fino de regex
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 ??p>
- "[# 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
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