2009-12-01 18 views
5

Dies ist meine erste Erfahrung mit C# und Teil meiner begrenzten Erfahrung mit regulären Ausdrücken und ich habe Probleme beim Erfassen des ersten Auftretens einer Übereinstimmung in einem bestimmten Ausdruck. Ich glaube, das folgende Beispiel würde es deutlicher machen als Worte, wenn ich beschreibe, was ich tun möchte.Capture der ersten Übereinstimmung mit Regex (C#)

Ich möchte zu diesem Ausdruck "Bob" anstelle von "Fehler" drucken.

Ich habe eine Ahnung, es hat etwas mit dem zu tun? vor der passenden Gruppe, aber ich bin mir nicht sicher, welche Operation die? führt in diesem speziellen Fall durch. Eine Erklärung mit etwas Hilfe wäre wunderbar.

Danke Jungs, Sie haben keine Ahnung, wie viel diese Website einem beginnenden Programmierer wie mir hilft.

+0

(? yourRegEx) bedeutet eine erfasste Gruppe, die den Namen "name" haben kann. Deshalb können Sie extractor.Groups ["name"] verwenden – nickytonline

Antwort

7

Ihr Problem Gier ist. Regex-Gier das ist. Dein. * Am Anfang schnappt sich all das "Das wird hoffentlich 1Bob aufnehmen". versuchen Sie diesen Regex stattdessen:

+0

Tschad, ich würde empfehlen, RegExWorkbench zu installieren, http://code.msdn.microsoft.com/RegexWorkbench. Es ist ein altes Projekt von Eric Gunnerson. Wenn .NET 1.x Framework nicht installiert ist, stellt er die Quelle bereit, damit Sie sie mit dem von Ihnen installierten Framework kompilieren können. – nickytonline

+0

Das hat tatsächlich "Bob" abgeholt. Genial. Ich denke, mein Problem war, dass ich diesen regulären Ausdruck behandle, als müsste er mit der ganzen Saite übereinstimmen, als ich wirklich nur gefragt habe, ob es eine Übereinstimmung gibt. Thanks a bunch – Chad

+0

Sie müssen daran denken, dass mit Regexes,. und * kann sehr böse sein. Wenn Sie Ihre Regex herstellen, müssen Sie wirklich wissen, was Sie finden möchten und nur das. Es braucht Zeit, aber wenn Sie das konsequent tun, werden Sie mit felsenfesten Regexen enden. Ich würde auch diese Seite empfehlen, http://www.regular-expressions.info und dass Sie dieses Buch lesen, Reguläre Ausdrücke beherrschen, http://regex.info. – nickytonline

3

Gleicht das vorhergehende Element null oder einmal ab. Es ist entspricht {0,1}. ? ist ein gieriger Quantifizierer, dessen nicht-gieriges Äquivalent ?? ist.

Aufgenommen von here. Die Seite enthält einen Spickzettel für reguläre Ausdrücke, und wenn ich deinen Ausdruck betrachte, kann ich nicht herausfinden, was daran falsch ist.

Meine Annahme ist, dass es möglicherweise das letzte Vorkommen Ihres Ausdrucks entspricht.

+0

Ich könnte falsch liegen, aber ich denke nicht, dass? ist in diesem Fall ein Quantor. Befolgen Quantifizierer normalerweise keinen Ausdruck? – Chad

+0

Es ist nichts falsch mit dem Ausdruck, er schaut nur auf den zweiten Wert, den er erfasst, anstatt auf den ersten. – Rory

+0

@Chad Die? In diesem Kontext wird der Beginn einer benannten Gruppe angezeigt (genauer gesagt der Name "name"). In den meisten anderen Orten wird es als Quantifizierer verwendet. – Rory

2

jedes Objekt eine Captures Sammlung hat, können Sie die erste Erfassung Zugriff für eine Gruppe mit:

extractor.Groups["name"].Captures[0] 
+0

P.S. Jedes Capture-Objekt verfügt über eine Value-Eigenschaft, die den tatsächlichen Zeichenfolgenwert des Captures zurückgibt, außerdem gibt es einige andere nützliche Eigenschaften wie den Index, bei dem das Capture in der ursprünglichen Zeichenfolge beginnt, und die Länge des Captures. Im Zweifelsfall drücken Sie F1. – Rory

+0

Hmmmm ... hilfreiche Informationen, aber Captures [0] nimmt immer noch "Fehler" Ist etwas falsch mit mir regulären Ausdruck? – Chad

2

Die Bracketing * Zeichen um Ihren Ausdruck verursachen Ihre Probleme. Denken Sie daran, dass Sie keinen regulären Ausdruck benötigen, der der gesamten Zeichenfolge entspricht - Sie möchten, dass nur ein bestimmtes Muster angezeigt wird, wenn es angezeigt wird. Der folgende Code funktioniert:

Regex pattern = new Regex(@"\d(?<name>.*?)\d"); 
MatchCollection matches = pattern.Matches("This hopefully will pick up 1Bob9error1 as a name"); 
Console.WriteLine(matches[0].Groups["name"]); 
Verwandte Themen