Outra maneira de afirmar o problema é:
||
(consecutivos |
) não são permitidos, nem os que incluem apenas dois ou mais espaços * .
- Se existir um
| |
(um espaço no meio) no texto a ser validado, ele deve ser precedido imediatamente por qualquer quantidade de |
texto não , com um |
ou outro | |
imediatamente antes disso , e deve ser seguido imediatamente por qualquer quantidade de texto não- texto. - |
texto seguido por um |
ou outro | |
.
- Se não
| |
houver, deve haver não |
ou exatamente dois |
.
A condição 1. é, tecnicamente, explicitamente descartada na pergunta ( "qualquer quantidade de texto" pode significar nenhum ou somente espaço é permitido), mas pode ser inferido a partir dos exemplos de que essa é a intenção do OP.
Com as condições reformuladas como acima, uma solução somente de fórmula se torna prontamente aparente, conforme aplicado na seguinte planilha:
Esta é a fórmula inserida B2:B11
:
=IF(CHOOSE(MIN(3,1+LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))),TRUE,FALSE,AND(LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))-(LEN(A1)-LEN(SUBSTITUTE(A1,"| |","")))/3*2=2,LEN(TRIM(MID(A1,FIND("|",A1)+1,FIND("|",A1,FIND("|",A1)+1)-FIND("|",A1)-1)))>0)),"ok","wrong")
Explicação:
A versão pré-modificada da fórmula é a seguinte:
=
IF(
CHOOSE(
MIN(3,1+LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))),
TRUE,
FALSE,
AND(
LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))-(LEN(A1)-LEN(SUBSTITUTE(A1,"| |","")))/3*2=2,
LEN(TRIM(MID(A1,FIND("|",A1)+1,FIND("|",A1,FIND("|",A1)+1)-FIND("|",A1)-1)))>0
)
),
"ok",
"wrong"
)
As três condições acima podem ser refatoradas para o seguinte:
[a] Deve haver precisamente 2 a mais do |
que os contabilizados pelos | |
s (o primeiro e o último).
e
[b] Se houver |
, deve haver pelo menos dois deles, e os dois primeiros devem ser separados por pelo menos um caractere não espacial.
A fórmula para [a] é:
LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))-(LEN(A1)-LEN(SUBSTITUTE(A1,"| |","")))/3*2=2
A fórmula para a |
parte de validação intra- texto de [b] é:
LEN(TRIM(MID(A1,FIND("|",A1)+1,FIND("|",A1,FIND("|",A1)+1)-FIND("|",A1)-1)))>0
A outra parte de [b] (ou seja, que não pode haver apenas uma |
) é tratada pela CHOOSE()
função, que também cuida do caso em que não há |
(necessário, pois esse caso de borda causa erros na fórmula [b ] e um resultado incorreto para a fórmula [a]).
O primeiro argumento da CHOOSE()
função,
MIN(3,1+LEN(A1)-LEN(SUBSTITUTE(A1,"|","")))
mapeia as contagens possíveis de |
s para os índices 1
, 2
e 3
assim: [0,1,2,3,4,…]
→ [1,2,3,3,3,…]
, e assim a função retorna TRUE
para uma contagem de 0
, FALSE
para uma contagem de 1
e o resultado da AND()
função para todas as outras contagens.
* A condição que não permite dois ou mais intra- |
espaços pode ser relaxada pelo uso da TRIM()
função.