Pessoal,
Tenho a seguinte regex:
[\||>|<|2>]$
Que estou usando para reconhecer um dos seguintes comandos: |, <, >, 2>.
O problema é que ela reconhece somente o 2 como matching também (queria que reconhece somente se o 2 aparecesse junto com um > formando o comando 2>).
[] não é a mesma coisa que ().
No seu caso, você teria de usar:
(\||<|>|2>)$
[quote=bezier curve][] não é a mesma coisa que ().
No seu caso, você teria de usar:
(\||<|>|2>)$[/quote]
É verdade. Eu estava usando o [] porque preciso na verdade “negar” os operadores. Ou seja, na primeira posição da string, eu quero que tudo seja valido, menos um desses operadores.
Logo, estava usando: [^\||<|>|2>]$
como eu faria essa negação usando ()?
A negação é mais complicada que parece. Procure por “negative lookbehind”.
http://www.regular-expressions.info/lookaround.html
vamos lá
quando vc usa [ e ] vc esta falando que quer um caracter (1) que esteja dentro destes limites (ou fora, se vc negar). Mas isto vale para um caracter.
Vc quer reconhecer pipes ou redirecionadores. Beleza. 2> é um identificador complexo, pois é seguido de um 2 e de um > – identificando o redirecionamento do descriptor 2 que geralmente é a STDERR.
Eu tentaria identificar um > que pode ser precedido por um numero, pois 1> é valido, assim como 3> , 999> – basta vc criar um descriptor destes.
e o < também pode ser precedido de um numero.
Eu encadearia IFs para encontrar estes caras se fosse usar REGEXP. Ou tentaria descrever uma gramatica e usar um parser que sabe lidar com gramatica BNF – deve ter uma versão do ANTLR para ansi C.