2011-03-30 6 views
5

J'ai une regex ([[email protected]\/,':\w]*[\w])* et il correspond à tous les mots dans un texte (y compris les mots ponctués comme IBM), mais je veux le faire exclure les traits de soulignement et je n'arrive pas à comprendre comment le faire .. J'ai essayé d'ajouter ^[_] (par exemple (^[_][[email protected]\/,':\w]*[\w])*) mais il ne fait que décomposer tous les mots en lettres. Je veux préserver le mot correspondant, mais je ne veux pas avoir de mots avec des traits de soulignement, ni de mots entièrement composés de traits de soulignement.Regex ignore underscores

Quelle est la bonne façon de faire cela?

P.S.

  • Mon application est écrite en C# (si cela fait une différence).
  • Je ne peux pas utiliser A-Za-z0-9 parce que je dois faire correspondre des mots sans tenir compte de la langue (peut être chinois, russe, japonais, allemand, anglais).

Mise à jour
Voici un exemple: "I.B.M doit être analysé comme un seul mot w_o_r_d russe devrait fonctionner aussi: мплекс исторических событий."

Les matchs doivent être:

I.B.M. 
should 
be 
parsed 
as 
one 
word 
Russian 
should 
work 
too 
мплекс 
исторических 
событий 

Notez que w_o_r_d ne devrait pas être jumelé.

+0

'^ [_]' devrait être '[_ _]'. Le premier trouvera un '_' au début de la chaîne (ou une ligne si elle est multiligne). – climbage

+0

@climbage, cela a certainement aidé à ignorer les underscores, mais les underscores dans les mots restent encore. – Kiril

Répondre

6

Essayez ceci:

([[email protected]\/,':\p{L}\p{Nd}]*[\p{L}\p{Nd}])* 

La classe \w se compose de [\p{L}\p{Nd}\p{Pc}] lorsque vous effectuez correspondant Unicode. (Ou tout simplement [a-zA-Z0-9] si vous faites correspondance non Unicode.)

Il est la catégorie \p{Pc} Unicode - ponctuation/connecteur - qui cause le problème en faisant correspondre underscores, donc nous correspondent explicitement contre les autres catégories sans inclure que un.

(. Pour plus d'informations ici, "Character Classes: Word Character", et ici, "Character Classes: Supported Unicode General Categories")

+1

'\ p {L}' est la même chose que '[\ p {Ll} \ p {Lu} \ p {Lt} \ p {Lo} \ p {Lm}]', ce qui réduirait considérablement votre regex.Voir [Catégories générales Unicode prises en charge] (http://msdn.microsoft.com/fr-fr/library/20bw873z.aspx#SupportedUnicodeGeneralCategories) –

+0

@jb: Bon emplacement! C'est beaucoup moins bavard. Je vais éditer ... – LukeH

2

Le trait de soulignement Tue provient de \w. Utilisez à la place A-Za-z0-9.

+0

Salut sidyll, merci pour l'info, mais malheureusement, je ne peux pas utiliser A-Za-z0-9 parce que je dois faire correspondre les mots indépendamment de la langue (pourrait être chinois, russe, japonais, allemand, anglais). – Kiril

Questions connexes