Preciso de ajuda com um Regex. Quero substituir todas as ocorrências de 5%
or 7%
or 183%
or 99%
para `` (string vazia) MAS se a ocorrência for 0%
or 100%
(podem ser dezenas de ocorrências que eu queira preservar) não quero fazer nada.
Por exemplo:
aaa 0% bbb
deveria se tornar aaa 0% bbb
(nada mudou)
No entanto
aaa 40% bbb
deveria se tornaraaa bbb
Eu criei um regex usando lookbehind negativo, mas ele apenas remove o %
sinal, não o número. Este é o regex:
substituir (?<!(0|100))%
por `` (string vazia)
A expressão regular acima, quando aplicada à string, aaa 40% bbb
retorna aaa 40 bbb
.
Este padrão regex manterá o
0%
e100%
e removerá qualquer outra porcentagem (número, sinal e o espaço seguinte).O padrão primeiro garante que haja s espaços em branco precedentes. Então ele tentará corresponder
100%
ou0%
seguido por espaços em branco. Se corresponder, a correspondência geral será substituída pelo caractere de espaço em branco correspondente100%
ou0%
seguido pelo caractere de espaço em branco correspondente (ou seja, nenhuma alteração na string correspondente). Se nenhuma correspondência corresponder, ele corresponderá a quaisquer dígitos seguidos por%
e um espaço em branco e o substituirá por uma string vazia, efetivamente apagando a porcentagem correspondente e um caractere de espaço em branco.REGEX (sabor PCRE2)
Demonstração Regex: https://regex101.com/r/VCOPJg/3
NOTAS:
(?<=\s)
Lookbehind positivo . Corresponde se houver um caractere de espaço em branco precedente (```````).(?:...)
Grupo não-capturador.((?:10)?0%\s)
Capturando(...)
número do grupo1
. Na$replacement
string referida como$1
.(?:10)?
Grupo não-capturador. Opcional?
, corresponde a 0 ou 1 vezes. Corresponde ao literal 1 seguido do literal 0.0%
Corresponde literal0
seguido de literal%
.|
OU.\d+%\s
Corresponda 1 ou mais (+
) dígitos (\d
) seguidos por um caractere de espaço em branco (\s
).CADEIA DE TESTE
RESULTADO:
Sua regex não faz o que você espera, porque a asserção lookbehind
(?<!(0|100))
não consome.Você pode usar um padrão para corresponder ao que deseja remover:
E substitua por uma string vazia.
A expressão regular corresponde a:
\b
Um limite de palavra para evitar uma correspondência parcial de palavras(?!
Visão negativa à frente, afirma que o que está diretamente à direita da posição atual não é(?:10)?0%
Combine opcionalmente 10 seguido de um 0 obrigatório e depois um%
)
Feche o lookahead\d+%
Combine 1+ dígitos seguidos por%
Veja uma demonstração do regex101
Se não houver nada precedendo os dígitos e seguindo o sinal de porcentagem, você pode usar limites de espaço em branco, afirmando nenhum caractere diferente de espaço em branco à esquerda e à direita:
Veja uma demonstração do regex 101
Use lookahead negativo antes do padrão correspondente, não lookbehind negativo.
DEMONSTRAÇÃO