Regex, ogni carattere non alfanumerico eccetto spazi bianchi o due punti


131

Come posso farlo ovunque?

Fondamentalmente, sto cercando di abbinare tutti i tipi di caratteri vari come e commerciali, punti e virgola, simboli di dollaro, ecc.


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

Risposte:


246
[^a-zA-Z\d\s:]
  • \ d - classe numerica
  • \ s - spazi bianchi
  • a-zA-Z - corrisponde a tutte le lettere
  • ^ - li nega tutti - in modo da ottenere - caratteri non numerici, non spazi e non due punti

Questo è quello che stavo guardando anche :)) - Devo promuovere la tua risposta perfetta
Tudor Constantin,

7
L'unica cosa che ho scoperto è che questo rimuove caratteri speciali come é o ã. Preferirei [^ \ w \ d \ s:].
Eric Belair,

5
Sottovalutato perché questo non catturerà caratteri non latini, né caratteri latini "speciali".
Damian,

\de \ssono le estensioni Perl che non sono tipicamente supportate da strumenti più vecchi come grep, sed, tr, lex, ecc
tripleee

38

Questo dovrebbe farlo:

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

1
Il resto controlla lo spazio ma non gli spazi o ha la negazione nel punto sbagliato per negare effettivamente.
Zachary Scott,

\ w cattura anche i trattini bassi - che è un carattere non alfanumerico
Tudor Constantin,

Aha! Modificherò - non lo sapevo. Mi aspetto che funzioni diversamente per motori diversi, ma potrebbe anche dare all'OP la risposta sicura.
Luke Sneeringer,

2
Sottovalutato perché questo non catturerà caratteri non latini, né caratteri latini "speciali".
Damian,

16

Se vuoi trattare i caratteri latini accentati (es. À Ñ) come lettere normali (es. Evita anche di abbinarli), dovrai anche includere l'intervallo Unicode appropriato ( \ u00C0- \ u00FF ) nella tua regex, quindi sarebbe simile a questo:

/[^a-zA-Z\d\s:\u00C0-\u00FF]/g
  • ^ nega ciò che segue
  • a-zA-Z corrisponde alle lettere maiuscole e minuscole
  • \d corrisponde alle cifre
  • \s corrisponde a uno spazio bianco (se si desidera abbinare solo spazi, sostituirlo con uno spazio)
  • : corrisponde a due punti
  • \u00C0-\u00FF corrisponde all'intervallo Unicode per caratteri latini accentati.

nb. La corrispondenza dell'intervallo Unicode potrebbe non funzionare per tutti i motori regex, ma quanto sopra sicuramente funziona in Javascript (come visto in questa penna su Codepen).

NB2. Se non ti preoccupi della corrispondenza dei caratteri di sottolineatura, puoi sostituirli a-zA-Z\dcon \wlettere, cifre e caratteri di sottolineatura.


Questa gamma contiene alcuni caratteri che non sono alfanumerici (U + 00D7 e U + 00F7) ed esclude molti caratteri accentati validi da lingue non occidentali come polacco, ceco, vietnamita ecc.
tripleee

1
Eseguito l'upgrade per la descrizione di ciascuna parte del RegEx.
morajabi,

14

Prova questo:

[^a-zA-Z0-9 :]

Esempio JavaScript:

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

Vedi un esempio online:

http://jsfiddle.net/vhMy8/


3
Sottovalutato perché questo non catturerà caratteri non latini, né caratteri latini "speciali".
Damian,

14
È facile votare una risposta, ma è ancora più difficile fornire informazioni costruttive al consiglio, ad esempio come si catturano i caratteri non latini, né i caratteri "speciali" latini? A partire dal mio conteggio fino a qui hai votato 3 risposte per lo stesso motivo e, a mio avviso, per un lieve miglioramento. Ad esempio, sono qui per trovare una regex esattamente per ciò che viene discusso in queste risposte. Non mi interessano i set di caratteri che non verranno utilizzati nella mia applicazione. Legge dei rendimenti decrescenti.

Aaron potrebbe essere una "modifica minore" per un cittadino americano, ma molto rilevante per ... il resto di questo pianeta.
Michael K. Borregaard,

4

Nessun alfanumerico, spazio bianco o '_'.

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

4

Se intendi "caratteri non alfanumerici", prova a usare questo:

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

1

Questo regex funziona per C # , PCRE e Vai per citarne alcuni.

Non funziona per JavaScript su Chrome da quello che dice RegexBuddy . Ma c'è già un esempio per questo qui.

Questa parte principale di questo è:

\p{L}

che rappresenta \p{L}o \p{Letter}qualsiasi tipo di lettera da qualsiasi lingua. »


La regex completa stessa: [^\w\d\s:\p{L}]

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


Questa è l'unica risposta qui che si occupa in modo corretto degli alfabeti accentati Unicode. Purtroppo, non tutti i motori regex supportano questa funzione (anche a Python manca, a partire dal 3.8, anche se il suo motore regex è apparentemente basato su PCRE).
Tripleee,

1
Rimuoverò Python dalla risposta, pensavo di averlo provato ma apparentemente no. Grazie per la segnalazione.
Ste

0

Prova ad aggiungere questo:

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

Questo ha funzionato per me... :)


Questo sembra ripetere la risposta accettata dal 2011. L' ancora ^e la $confina per abbinare intere linee e il *quantificatore significa che corrisponde anche a linee vuote.
Tripleee

0

In JavaScript:

/[^\w_]/g

^negazione, ovvero selezionare qualsiasi cosa non nel seguente set

\w qualsiasi carattere di parola (ovvero qualsiasi carattere alfanumerico, più trattino basso)

_ annulla il carattere di sottolineatura, poiché è considerato un carattere "parola"

Esempio di utilizzo - const nonAlphaNumericChars = /[^\w_]/g;

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.