Regex Padrão - Permitir alfa numérico, um grupo de caracteres especiais, mas não uma determinada sequência de caracteres
-
06-07-2019 - |
Pergunta
Eu tenho o seguinte regex:
(?!^[&#]*$)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
Assim, permitam A-Z, a-z, 0-9, e estes especial caracteres '.,&@:?!()$#/\
Eu quero não corresponder se o seguinte conjunto de caracteres é encontrado em qualquer lugar na string nesta ordem:
&#
Quando eu executar este regex com apenas "& #" como entrada, ele não coincide com o meu padrão, eu recebo um erro, ótimo. Quando eu executar o regex com '.,&@:?!()$#/\ABC123
Ele coincide com o meu padrão, sem erros.
No entanto, quando eu executá-lo com:
'.,&#@:?!()$#/\ABC123
Não erro também. Eu estou fazendo algo errado com a seleção para o & seqüência #.
Alguém pode me dizer o que eu fiz de errado, eu não sou muito bem com essas coisas.
Solução
Emprestando uma técnica para combinar cadeias entre aspas, &
remover da sua classe de personagem, adicione uma alternativa para &
não seguida por #
, e permitir que a corda para opcionalmente terminar com &
:
^((?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&[^#])*&?)$
Outras dicas
Eu realmente fazê-lo em duas partes:
- Verifique se o seu conjunto de caracteres permitido. Para fazer isso eu iria procurar caracteres que não são permitidos, e retornar falso se há um jogo. Isso significa que tenho uma simples expressão agradável:
[^A-Za-z0-9'\.&@:?!()$#^]
- Verifique se o seu substring banido. E já que é apenas uma substring, eu provavelmente não iria mesmo usar um regex para essa parte.
Você não mencionou o seu idioma, mas em caso de C #:
bool IsValid(string input)
{
return !( input.Contains("&#")
|| Regex.IsMatch(@"[^A-Za-z0-9'\.&@:?!()$#^]", input)
);
}
^((?!&#)[A-Za-z0-9-'.,&@:?!()$#/\\])*$
Observe que a última \ escapou (dobrado)
SO liga automaticamente \\
em \ se não em backticks
Assumindo Perl RegExp compatíveis
Para não corresponder na string '& #':
(?![^&]*&#)^([A-Za-z0-9-'.,&@:?!()$#/\\]*)$
Embora você não precisa dos parênteses, porque você está encontrando a string inteira.
Apenas FYI, embora obras regex de Ben em branco, é mais complicado do que precisa ser. Eu faria isso como este:
^(?:[A-Za-z0-9-'.,@:?!()$#/\\]+|&(?!#))+$
Porque eu usei um negativo lookahead em vez de uma classe de caracteres negada, o regex não precisa de qualquer ajuda extra para coincidir com um e comercial no final da cadeia.
Eu recomendo usar duas expressões regulares em uma condicional:
if (string has sequence "&#")
return false
else
return (string matches sequence "A-Za-z0-9-'.,&@:?!()$#/\")
Eu acredito que o seu segundo "principal" regex de
^([A-Za-z0-9-'.,&@:?!()$#/\])$"
tem vários erros:
- Ele irá testar apenas um personagem em seu conjunto
- O personagem
\
em expressões regulares é um sinal indicando que o próximo caractere é parte de algum tipo de "classe" de caracteres (ex.\n
= é o caractere de alimentação de linha). O\]
sequência de caracteres está realmente causando sua lista entre colchetes não deve ser encerrado.
Você pode ser melhor fora de usar
^[A-Za-z0-9-'.,&@:?!()$#/\\]+$
Note que o caractere de barra é representado por um duplo golpe.
O personagem +
indica que pelo menos um caractere que está sendo testado tem que corresponder ao regex; se ele é bom para passar uma cadeia de comprimento zero, substituir o +
com um *
.