Expressão regular para excluir caracteres especiais

Estou tendo problemas para criar uma expressão regular que essencialmente lista negra alguns caracteres especiais.

Eu preciso usar isso para validar dados em campos de input (em um aplicativo da Web Java). Queremos permitir que os usuários digitem qualquer dígito, letra (precisamos include caracteres acentuados, ex. Francês ou alemão) e alguns caracteres especiais, como ‘-. etc.

Como faço para colocar os caracteres na lista negra como % $ etc?

Qualquer ajuda seria muito apreciada.

Eu apenas listaria os caracteres em branco.

^[a-zA-Z0-9äöüÄÖÜ]*$ 

Construir uma lista negra é igualmente simples com o regex, mas você pode precisar adicionar muito mais caracteres – existem muitos símbolos chineses no unicode …;)

 ^[^<>%$]*$ 

A expressão [^ (muitos caracteres aqui)] corresponde a qualquer caractere que não esteja listado.

Para excluir certos caracteres (< ,>,% e $), você pode fazer uma expressão regular como esta:

 [<>%\$] 

Essa expressão regular corresponderá a todas as inputs que contiverem um caractere na lista negra. Os colchetes definem uma class de caractere, e o \ é necessário antes do cifrão, porque o cifrão tem um significado especial em expressões regulares.

Para adicionar mais caracteres à lista negra, basta inseri-los entre os colchetes; ordem não importa.

De acordo com alguma documentação Java para expressões regulares , você poderia usar a expressão como esta:

 Pattern p = Pattern.compile("[<>%\$]"); Matcher m = p.matcher(unsafeInputString); if (m.matches()) { // Invalid input: reject it, or remove/change the offending characters. } else { // Valid input. } 

Geralmente, é melhor definir os caracteres permitidos na lista de permissions, em vez de include caracteres que você não permite. tanto do ponto de vista de segurança quanto do ponto de vista da implementação.

Se você descer a rota da lista negra, aqui está um exemplo, mas esteja avisado, a syntax não é simples.

http://groups.google.com/group/regex/browse_thread/thread/0795c1b958561a07

Se você quiser colocar na lista de permissions todos os caracteres de acentuação, talvez usar intervalos unicode ajudaria? Confira este link.

http://www.regular-expressions.info/unicode.html

Eu acho que depende do idioma que você está alvejando. Em geral, algo assim deveria funcionar:

 [^<>%$] 

A construção ” [] ” define uma class de caracteres, que corresponderá a qualquer um dos caracteres listados. Colocar ” ^ ” como o primeiro caractere nega a correspondência, ou seja: qualquer caractere diferente de um dos listados.

Você pode precisar escaping de alguns dos caracteres dentro de ” [] “, dependendo de qual mecanismo de linguagem / regex você está usando.

Mesmo em 2009, parece que muitos tinham uma idéia muito limitada do que estava sendo projetado para a web mundial. Em 2015, a menos que seja projetado para um país específico, uma lista negra é a única maneira de acomodar o grande número de caracteres que podem ser válidos.

Os personagens da lista negra precisam ser escolhidos de acordo com o que é ilegal para o propósito para o qual os dados são necessários.

No entanto, às vezes, vale a pena quebrar os requisitos e lidar com cada um separadamente. Aqui o look-ahead é seu amigo. Estas são seções limitadas por (?=) Para positivo, e (?!) Para negativo, e efetivamente se tornam blocos AND, porque quando o bloco é processado, se não falhar, o processador regex começará no início do texto com o próxima quadra. Efetivamente, cada bloco de look-ahead será precedido pelo ^ , e se seu padrão for ganancioso, inclua até $ . Até mesmo o antigo mecanismo regex VB6 / VBA (Office) 5.5 suporta look-ahead.

Então, para construir uma expressão regular completa, comece com os blocos de look-ahead, depois adicione o bloco de caracteres na lista negra antes do $ final.

Por exemplo, para limitar o número total de caracteres, digamos entre 3 e 15 inclusive, comece com o bloco de look-ahead positivo (?=^.{3,15}$) . Note que isso precisava do seu próprio e do $ para garantir que abrangesse todo o texto.

Agora, enquanto você pode querer permitir _ e -, você pode não querer começar ou terminar com eles, então adicione os dois blocos de look-ahead negativos, (?![_-].+) Para start, e (?!.+[_-]$) para fins.

Se você não quiser múltiplos _ - , adicione um bloco de look-ahead negativo de (?!.*[_-]{2,}) . Isso também excluirá sequências -_ .

Se não houver mais blocos de look-ahead, adicione o bloco de lista negra antes do $ , como [^<>[\]{\}|\\\/^~%# :;,$%?\0-\cZ]+ , onde o \0-\cZ exclui caracteres nulos e de controle, incluindo NL ( \n ) e CR ( \r ). A final + garante que todo o texto seja incluído avidamente.

Dentro do domínio Unicode, pode haver outros pontos de código ou blocos que precisam ser excluídos também, mas certamente muito menos do que todos os blocos que deveriam ser incluídos em uma lista branca.

Todo o regex de todos os itens acima seria então

 (?=^.{3,15}$)(?![_-].+)(?!.+[_-]$)(?!.*[_-]{2,})[^<>[\]{}|\\\/^~%# :;,$%?\0-\cZ]+$ 

que você pode conferir ao vivo em https://regex101.com/ , para mecanismos pcre (php), javascript e python regex. Eu não sei onde o regex java se encheckbox naqueles, mas você pode precisar modificar o regex para atender suas idiossincrasias.

Se você quiser include espaços, mas não _ , basta trocá-los em todos os locais da regex.

A aplicação mais útil para esta técnica é para o atributo pattern para campos de input HTML, onde uma única expressão é requerida, retornando um falso para falha, tornando assim o campo inválido, permitindo input:invalid css input:invalid para destacá-lo e parando o formulário sendo submetido.

Você realmente deseja colocar na lista negra caracteres específicos ou, na verdade, colocar na lista branca os caracteres permitidos?

Eu suponho que você realmente quer o último. Isso é bem simples (adicione quaisquer símbolos adicionais à lista branca no grupo [\-] ):

 ^(?:\p{L}\p{M}*|[\-])*$ 

Edit: Otimizado o padrão com a input dos comentários

Por que você considera regex a melhor ferramenta para isso? Se o seu propósito é detectar se um caractere ilegal está presente em uma string, testar cada caractere em um loop será mais simples e eficiente do que construir um regex.

Aqui estão todos os caracteres franceses acentuados: à €

Gostaria de google uma lista de caracteres acentuados alemães. Não há tantos. Você deve conseguir todos eles.

Para URLs, eu substituo URLs acentuados por letras comuns como:

 string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ'ñ"; string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n"; for (int i = 0; i < beforeConversion.Length; i++) { cleaned = Regex.Replace(cleaned, beforeConversion[i].ToString(), afterConversion[i].ToString()); } 

Há provavelmente uma maneira mais eficiente, lembre-se de você.

Use este aqui

^ (? = [a-zA-Z0-9 ~ @ # $ ^ () _ + = [] {} | \,.?: -] $) (?!. * [<> ‘”/;`% ])

O conjunto negado de tudo o que não é alfanumérico e sublinhado para caracteres ASCII:

 /[^\W]/g 

Para validação de email ou nome de usuário, usei a seguinte expressão que permite 4 caracteres especiais padrão – _. @

 /^[-.@_a-z0-9]+$/gi 

Para um uso de expressão somente alfanumérico estrito:

 /^[a-z0-9]+$/gi 

Test @ RegExr.com

Eu suspeito fortemente que será mais fácil chegar a uma lista dos personagens que são permitidos versus os que não são – e uma vez que você tem essa lista, a syntax regex se torna bastante simples. Então me coloque para baixo como outro voto para “whitelist”.

você pode usar diretamente [<>%$] , porque temos $ , caso contrário, temos várias opções

 .*(< |>|%).*