Outra maneira de afirmar o problema é:
-
||
(|
consecutivos) não são permitidos, nem aqueles que incluem apenas dois ou mais espaços * . - Se houver um
| |
(um espaço no meio) no texto a ser validado, ele deve ser imediatamente precedido por qualquer quantidade de texto que não seja|
, com|
ou outro| |
imediatamente antes de , e ele deve ser imediatamente seguido por qualquer quantidade de texto que não seja|
seguido por|
ou outro| |
. - Se não houver
| |
, então não deve haver|
ou exatamente dois|
.
Condição 1. é, tecnicamente, explicitamente descartada na questão, ( "qualquer quantidade de texto" pode significar nenhum ou somente espaço é permitido) mas pode ser inferido a partir dos exemplos que esta é a intenção do OP.
Com as condições reformuladas como acima, uma solução somente de fórmula torna-se prontamente aparente conforme visto na seguinte planilha:
EstaéafórmulainseridaemB2: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 prettificada 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 mais 2 |
do que aqueles representados pelos | |
s (o primeiro e o último).
e
[b] Se houver qualquer |
, 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 do texto intra- |
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 um |
) é cuidada pela função CHOOSE()
, que também cuida do caso quando não há |
(necessário, já que este caso de borda causa erros na fórmula [b] e um resultado incorreto para a fórmula [a]).
O primeiro argumento da função CHOOSE()
,
MIN(3,1+LEN(A1)-LEN(SUBSTITUTE(A1,"|","")))
mapeia as possíveis contagens de |
s para os índices 1
, 2
e 3
, assim: [0,1,2,3,4,…]
→ [1,2,3,3,3,…]
e, portanto, a função retorna TRUE
para uma contagem de 0
, FALSE
para uma contagem de 1
e o resultado da função AND()
para todas as outras contagens.
* A condição que não permite dois ou mais espaços entre |
pode ser relaxada pelo uso da função TRIM()
.