2010-05-17 3 views
1

Il me manque quelque chose de très évident ici, mais je ne peux pas le voir.Le cas du backslash sournois - Regex

J'ai:

string input = @"999\abc.txt"; 
string pattern = @"\\(.*)"; 
string output = Regex.Match(input,pattern).ToString(); 
Console.WriteLine(output); 

Mon résultat est:

\abc.txt 

Je ne veux pas la barre oblique et ne peux pas comprendre pourquoi il est faufilant dans la sortie. J'ai essayé renversant le modèle et la barre oblique serpente dans la sortie à nouveau:

string pattern = @"^(.*)\\"; 

et obtenez:

999\ 

étrange. Le résultat est bon dans le régulateur d'Osherove. Des pensées?

Merci.

Répondre

10

Le Match est le entier match; vous voulez le premier groupe;

string output = Regex.Match(input,pattern).Groups[1].Value; 

(de la mémoire, peut varier légèrement)

+2

Ah! Battez-moi. –

+0

Ouais, ça l'a fait. Merci. –

+1

Juste pour clarifier pour quiconque se demandant pourquoi c'est l'index de 1 au lieu de l'index de 0 dans les groupes, c'est parce que l'index de 0 renvoie un groupe qui représente la correspondance entière. – jjxtra

1

Utilisez Groups pour obtenir que le groupe, pas tout le match:

string output = Regex.Match(input, pattern).Groups[1].Value; 
0

Comme alternative à la réponse de Marc, vous pouvez utiliser un zero-width positive lookbehind assertion dans votre modèle:

string pattern = @"(?<=\\)(.*)"; 

Cela correspond à "\" mais exclut de la capture

0

Vous pouvez essayer le préfixe de correspondance/postfix mais exclure les options.

tout match après la première barre oblique/

(?<=\\)(.*)$ 

tout match après la dernière barre oblique/

(?<=\\)([^\\]*)$ 

tout match avant la dernière barre oblique/

^(.*)(?=\\) 

BTW, téléchargez Expresso pour tester les expressions régulières, durée de vie totale.