Regex Padrão - Permitir alfa numérico, um grupo de caracteres especiais, mas não uma determinada sequência de caracteres

StackOverflow https://stackoverflow.com/questions/429719

  •  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.

Foi útil?

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:

  1. 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'\.&@:?!()$#^]
  2. 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 *.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top