2017-07-19 1 views
0

J'essaie de capturer chaque mot dans un document .txt. Les mots sont définis comme toute chaîne de caractères et traits d'union intacts, qui peuvent avoir une apostrophe (les caractères apostrophe et "DROITE COTATION INDIVIDUELLE" sont saisis car l'entrée peut utiliser l'un ou l'autre des caractères) ou, en tant que expression régulière:Problème avec cette expression régulière en C# impliquant Apostrophe

[a-zA-Z\-]+['a-zA-Z\-\’\']* 

maintenant, cela semble fonctionner dans plusieurs tests de Regex en ligne thingos web-app, mais il ne semble pas vouloir travailler dans mon code C# et je ne comprends pas pourquoi:

MatchCollection matches = Regex.Matches(input_String.ToLowerInvariant(), 
             @"[a-zA-Z\-]+['a-zA-Z\-\’\']*"); 
string[] sorting_String = matches.Cast<Match>().Select(match => match.Value).ToArray(); 

Quand un wo rd comme "je suis" est contenu dans le texte, il renvoie "i" et "m" comme des mots séparés, plutôt que l'entrée unique "je suis".

Je n'ai pas trouvé quoi que ce soit de googler cette fois, et comme il fonctionne comme prévu dans les testeurs en ligne ... et je ne peux pas comprendre si c'est un problème d'échappement ... Je suis perplexe.

Quelqu'un pourrait-il m'expliquer pourquoi il ne retourne pas ce que j'attends en C#? Ou au moins, avec la bibliothèque System.Text.RegularExpressions? Je suppose que c'est juste que je suis stupide/ignorant.

EDIT 1: Voici une capture d'écran des locaux présentant le problème - Image of Locals Cela devrait être "livre". Huh, je viens inspecté ma variable de chaîne d'entrée, et il semble que je reçois des trucs comme ça: Image of encoding issue? maybe?

Ehhhh, l'entrée est un fichier txt - et il le formatage est conservé dans le fichier ... donc Il se passe quelque chose dans mon code qui ne joue pas bien ... euh, au moins, c'est là que je suppose que le problème est maintenant ... Je ne suis pas un expert dans ce XD. Excusez-moi d'être dérangé, mais pourrais-je être dirigé vers des ressources qui pourraient m'aider avec cela?

+2

Essayez de supprimer '" @ "'. –

+1

[Je ne peux pas reproduire le problème] (http://ideone.com/dSDvY4). Aussi, un meilleur motif pourrait être '[a-zA-Z] + (?: ['' -] [a-zA-Z] +) *' ou même '\ p {L} + (?: ['' -] \ p {L} +) * '. –

+0

@ MichałTurczyn ma première pensée, aussi, mais sans le @ ce n'est même pas une chaîne littérale légale. Le @ est correct ici. –

Répondre

1

Vous pouvez essayer cette [\w\'\-]+[\w\'\-]* et voir si cela fonctionne

Je pense que vous devriez échapper à la première ' sur le deuxième support.