Regex, todos os caracteres não alfanuméricos, exceto espaços em branco ou dois pontos


131

Como posso fazer este em qualquer lugar?

Basicamente, estou tentando corresponder a todos os tipos de caracteres diversos, como e comercial, ponto e vírgula, cifrões etc.


13
/[^a-zA-Z0-9\s\:]*/
— 1955 Kelly

Respostas:


246
[^a-zA-Z\d\s:]
  • \ d - classe numérica
  • \ s - espaço em branco
  • a-zA-Z - corresponde a todas as letras
  • ^ - nega todos eles - para que você obtenha - caracteres não numéricos, espaços e dois pontos

Isso é o que eu estava olhando também :)) - Eu tenho que promover a sua resposta perfeita
— Tudor Constantin

6
A única coisa que descobri é que isso remove caracteres especiais como é ou ã. Eu preferiria [^ \ w \ d \ s:].
— Eric Belair

5
Diminuiu o voto porque isso não captura caracteres não latinos, nem caracteres latinos "especiais".
— Damian

\de \ssão extensões Perl que normalmente não são suportados por ferramentas mais antigas, como grep, sed, tr, lex, etc.
— tripleee

38

Isso deve servir:

[^a-zA-Z\d\s:]

1
O restante verifica se há espaço, mas não em branco, ou tem a negação no local errado para realmente negar.
— Zachary Scott

\ w também mostra sublinhados - que é um caracter não alfanumérico
— Tudor Constantin

Aha! Vou modificar - não sabia disso. Espero que funcione de maneira diferente para diferentes mecanismos, mas também pode dar ao OP a resposta segura.
— Luke Sneeringer

2
Diminuiu o voto porque isso não captura caracteres não latinos, nem caracteres latinos "especiais".
— Damian

16

Se você deseja tratar caracteres latinos acentuados (por exemplo, à Ñ) como letras normais (evite correspondê-los também), também precisará incluir o intervalo Unicode apropriado ( \ u00C0- \ u00FF ) em seu regex, para que ficaria assim:

/[^a-zA-Z\d\s:\u00C0-\u00FF]/g
  • ^ nega o que se segue
  • a-zA-Z combina letras maiúsculas e minúsculas
  • \d corresponde a dígitos
  • \s corresponde ao espaço em branco (se você quiser corresponder apenas a espaços, substitua-o por um espaço)
  • : corresponde a dois pontos
  • \u00C0-\u00FF corresponde ao intervalo Unicode para caracteres latinos acentuados.

nb. A correspondência de intervalo Unicode pode não funcionar para todos os mecanismos de expressão regular , mas o acima certamente funciona em Javascript (como visto nesta caneta no Codepen).

nb2. Se você não estiver preocupado com a correspondência de sublinhados, substitua-o a-zA-Z\dpor \w, que corresponde a letras, dígitos e sublinhados.


Esta gama contém alguns caracteres que não são alfanuméricos (U + 00D7 e U + 00F7) e exclui um monte de caracteres acentuados válidos de idiomas não-ocidentais, como polonês, tcheco, vietnamita etc.
— tripleee

1
Voto positivo para a descrição de cada parte do RegEx.
— Morajabi 9/12/19

14

Tente o seguinte:

[^a-zA-Z0-9 :]

Exemplo de JavaScript:

"!@#$%* ABC def:123".replace(/[^a-zA-Z0-9 :]/g, ".")

Veja um exemplo online:

http://jsfiddle.net/vhMy8/


3
Diminuiu o voto porque isso não captura caracteres não latinos, nem caracteres latinos "especiais".
— Damian

14
É fácil votar em uma resposta e ainda mais difícil fornecer informações construtivas ao quadro, por exemplo, como é que se pega caracteres não latinos, nem caracteres latinos "especiais"? Até agora, você votou 3 respostas pelo mesmo motivo e, na minha opinião, por um pequeno ajuste. Por exemplo, estou aqui para encontrar uma regex para exatamente o que é discutido nessas respostas. Não ligo para conjuntos de caracteres que não serão usados ​​no meu aplicativo. Lei dos rendimentos decrescentes.

Aaron pode ser um "pequeno ajuste" para um cidadão dos EUA, mas altamente relevante para ... o resto deste planeta.
— Michael K. Borregaard 17/03

4

Nenhum espaço alfanumérico, em branco ou '_'.

var reg = /[^\w\s)]|[_]/g;

4

Se você quer dizer "caracteres não alfanuméricos", tente usar o seguinte:

var reg =/[^a-zA-Z0-9]/g      //[^abc]

1

Esse regex funciona para C # , PCRE e Go, para citar alguns.

Não funciona para JavaScript no Chrome, pelo que diz o RegexBuddy . Mas já existe um exemplo para isso aqui.

Esta parte principal disso é:

\p{L}

que representa \p{L}ou \p{Letter}qualquer tipo de letra de qualquer idioma.`


A regex completa em si: [^\w\d\s:\p{L}]

Exemplo: https://regex101.com/r/K59PrA/2


Esta é a única resposta aqui que lida corretamente com os alfabéticos acentuados Unicode de maneira adequada. Infelizmente, nem todos os mecanismos regex suportam esse recurso (até o Python não possui, a partir do 3.8, embora seu mecanismo regex seja ostensivamente baseado em PCRE).
— Tripleee 6/12/19

1
Vou remover o Python da resposta, pensei ter testado isso, mas aparentemente não. Obrigado por apontar isso.
— #

0

Tente adicionar isto:

^[^a-zA-Z\d\s:]*$

Isso tem funcionado para mim... :)


Isso parece repetir a resposta aceita de 2011. As âncoras ^e o $limitam para corresponder a linhas inteiras e o *quantificador significa que também corresponde a linhas vazias.
— Tripleee 6/12/19

0

Em JavaScript:

/[^\w_]/g

^negação, ou seja, selecione qualquer coisa que não esteja no conjunto a seguir

\w qualquer caractere de palavra (ou seja, qualquer caractere alfanumérico, mais sublinhado)

_ negar o sublinhado, pois é considerado um caractere de 'palavra'

Exemplo de uso - const nonAlphaNumericChars = /[^\w_]/g;

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.