2009-08-08 20 views
11

Esiste un'istruzione regex speciale come \ w che denota tutti i caratteri stampabili? Mi piacerebbe verificare che una stringa contenga solo un carattere che può essere stampato, ad es. non contiene caratteri di controllo ASCII come \ b (campana), o null, ecc. Qualsiasi cosa sulla tastiera va bene, così come i caratteri UTF.Regex per tutti i caratteri PRINTABLE

Se non c'è un'istruzione speciale, come posso specificarlo in un'espressione regolare?

+3

Se stavi cercando caratteri ASCII puri, potresti usare un Regex come '[- ~] +', che corrisponde ad ogni ASCII basso dallo spazio alla tilde . – saluce

risposta

7

Esiste una designazione di classe di carattere POSIX [:print:] che deve corrispondere ai caratteri stampabili e [:cntrl:] per i caratteri di controllo. Si noti che questi codici di corrispondenza in tutta la tabella ASCII, quindi potrebbero non essere adatti per la corrispondenza con altre codifiche.

In caso contrario, l'espressione [\x00-\x1f] corrisponderà ai caratteri di controllo ASCII, anche se, di nuovo, questi potrebbero essere stampabili in altre codifiche.

1

Dipende selvaggiamente dal pacchetto di espressioni regolari che si sta utilizzando. Questa è una di queste situazioni in cui alcuni hanno detto che il bello degli standard è che ci sono così tanti tra cui scegliere.

Se si utilizza C, la funzione/macro isprint(3) è tua amica.

13

Se il sapore regex supporta Unicode properties, questo è probabilmente il meglio che il modo migliore:

\P{Cc} 

che corrisponde a qualsiasi carattere che non è un carattere di controllo, che si tratti di ASCII - [\x00-\x1F\x7F] - o Latin1 - [\x80-\x9F] (noto anche come caratteri di controllo C1).

Il problema con le classi POSIX come [:print:] o \p{Print} è che possono corrispondere a cose diverse a seconda del sapore regex e, possibilmente, delle impostazioni locali della piattaforma sottostante. In Java, sono strettamente orientati verso l'ASCII. Ciò significa che \p{Print} corrisponde solo ai caratteri di stampa ASCII - [\x20-\x7E] - mentre \P{Cntrl} (nota la 'P' maiuscola) corrisponde a tutto ciò che è non un carattere di controllo ASCII - [^\x00-\x1F\x7F]. Ovvero, corrisponde a qualsiasi carattere ASCII che non sia un carattere di controllo, o qualsiasi carattere non ASCII, inclusi i caratteri di controllo C1.

8

Molto tardi alla festa, ma questa espressione regolare funziona: /[ -~]/.

Come? Corrisponde a tutti i caratteri nell'intervallo da spazio (ASCII DEC 32) a tilde (ASCII DEC 126), che è l'intervallo di tutti i caratteri stampabili.

Se si vuole mettere a nudo i caratteri non-ASCII, si potrebbe usare qualcosa come:

$someString.replace(/[^ -~]/g, ''); 

NOTA: questo non è valido il codice .net, ma un esempio di utilizzo di espressioni regolari per coloro che inciampano su questa via di ricerca motori più tardi.

0

L'aggiunta a @ Alan-Moore, \P{Cc} è in realtà l'esempio di Negative Unicode Category or Unicode Block (riferimento: Character Classes in Regular Expressions). \P{name} corrisponde a qualsiasi carattere che non appartiene a a una categoria generale Unicode oa un blocco denominato. Vedi il link indicato per ulteriori esempi di blocchi denominati supportati in .Net

Problemi correlati