2010-10-19 12 views

risposta

29

Usa Regex Sottrazione

[\p{P}-[._]] 

Ecco il collegamento per documentazione di .NET Regex (non sono sicuro se altri sapori supportano) ... http://msdn.microsoft.com/en-us/library/ms994330.aspx

Ecco un esempio C#

string pattern = @"[\p{P}\p{S}-[._]]"; // added \p{S} to get ^,~ and ` (among others) 
string test = @"_""'a:;%^&*~`[email protected]#.,?"; 
MatchCollection mx = Regex.Matches(test, pattern); 
foreach (Match m in mx) 
{ 
    Console.WriteLine("{0}: {1} {2}", m.Value, m.Index, m.Length); 
} 

Spiegazione Il modello è una sottrazione classe di caratteri. Inizia con una classe di caratteri standard come [\ p {P}] e poi aggiunge una classe di caratteri di sottrazione come - [._] che dice di rimuovere il. e _. La sottrazione viene posizionata all'interno di [] dopo l'intestazione della classe standard.

+0

Sembra che non corrisponda a ^, ~ o '; potrei testarlo male o .NET non li considera come segni di punteggiatura? – Smashery

+0

Se si rilascia il - [._], quindi \ p {P} non corrisponde nemmeno a loro. – Les

+0

Quindi .NET non li considera punteggiatura? – Smashery

1

Si potrebbe utilizzare una classe di caratteri negata in questo modo:

[^0-9A-Za-z._\s] 

Questo include tutti i caratteri ad eccezione quelli elencati. Potrebbe essere necessario escludere più caratteri (come i caratteri di controllo), a seconda dei tuoi requisiti finali.

+0

che otterrebbe spazi troppo –

+0

va bene, aggiungere spazio all'elenco di esclusione. –

+4

Va bene, ma voglio la metà del vostro rappresentante per questa domanda ... –

8

Ecco qualcosa di un po 'più semplice. Non parole o spazi bianchi (dove le parole includono A-Za-z0-9 AND underscore).

[^\w\s.] 
+0

Funziona anche in Ruby! – zanbri

12

Le risposte finora non rispettano TUTTA la punteggiatura. Questo dovrebbe funzionare:

(?![\._])\p{P} 

(Spiegazione: lookahead negativo per garantire che né ._ sono abbinati, quindi qualsiasi carattere Unicode punteggiatura.)

+0

Sembra che non corrisponda a ^, ~ o '; potrei testarlo male o .NET non li considera come segni di punteggiatura? – Smashery

+0

@Smashery Questi sono accenti, non li useresti mai come punteggiatura in inglese. – steinar

+0

Grazie mille! Ho deciso di accettare la risposta di Les, perché trovo che Regex Subtraction sia più facile da capire concettualmente; quindi sono più propenso a ricordarlo; ma +1 - grazie per avermi insegnato alcune cose nuove!(Vorrei poter accettare due risposte) – Smashery

Problemi correlati