2012-04-04 5 views
2

Diese Frage ist sehr ähnlich zu einer früheren Frage, die ich fragte (This Question), aber ich muss es leicht ändern.Regex Split String bei bestimmten Wort Muster differant Wert in Match-Gruppe

So in der früheren Frage diese Zeichenfolge

 
Berkshire Hathaway Inc (Ticker: BRK; NAICS: 524126, 511130, 335212, 445292, 511110, 442210; Duns: 00-102-4314) Walt Disney Co (Ticker: DIS; NAICS: 713110, 512110, 711211, 515120; Duns: 00-690-4700) 

2 Matches mit diesen Werten erstellt:

 
Berkshire Hathaway Inc 
Walt Disney Co 

Jetzt möchte ich die Spiele Ticker enthalten: XXX oder der Firmenname mit Vorliebe gehen Ticker: XXX.

So zum Beispiel oben würde es entsprechen:

 
Ticker: BRK 
Ticker: DIS 

Und für dieses Beispiel:

 
Berkshire Hathaway Inc (NAICS: 524126, 511130, 335212, 445292, 511110, 442210; Duns: 00-102-4314) Walt Disney Co (Ticker: DIS; NAICS: 713110, 512110, 711211, 515120; Duns: 00-690-4700) 

Das Ergebnis wäre:

 
Berkshire Hathaway Inc 
Ticker: DIS 

Ich glaube, ich nur don‘ Ich verstehe die Regex-Lösung in der vorherigen Frage gut genug, um zu verstehen, wie man sie an dieses Muster anpasst.

Die Regex in C# geschrieben

Durch die Art und Weise der vorherigen regex Lösung war:

(?!\s*$)(.*?)(?:\([^)]*(?:(?:SIC|NAICS):[^)]*)+\)|$) 

, die ich denke, sollte nun auf diese geändert werden:

(?!\s*$)(.*?)(?:\([^)]*(?:(?:SIC|NAICS|Duns):[^)]*)+\)|$) 

aber wie Ich extrahiere den Ticker: und wähle diesen Wert über dem anderen Wert, wenn Ticker existiert?

Antwort

4

Ich lerne immer noch Regex, also bin ich mir nicht sicher, ob Sie bedingte Logik für Gruppen verwenden können. obwohl Als Alternative könnten Sie Ihre Regex wie folgt ändern, so dass es auch eine Gruppe für den Ticker erfasst, wenn es vorhanden ist:

(?!\s*$)(.*?)(?:\((Ticker:[^;]+)?[^)]*(?:(?:SIC|NAICS|Duns):[^)]*)+\)|$) 

Dann könnten Sie die Logik in C# -Code zu tun. Ich denke, so etwas wie dies funktionieren würde:

Regex regex = new Regex(@"(?!\s*$)(.*?)(?:\((Ticker:[^;]+)?[^)]*(?:(?:SIC|NAICS|Duns):[^)]*)+\)|$)"); 
Match match = regex.Match("Berkshire Hathaway Inc (NAICS: 524126, 511130, 335212, 445292, 511110, 442210; Duns: 00-102-4314) Walt Disney Co (Ticker: DIS; NAICS: 713110, 512110, 711211, 515120; Duns: 00-690-4700)"); 
while (match.Success) { 
    if (match.Groups[2].Success) 
    { 
     Console.WriteLine(match.Groups[2].Value); 
    } 
    else 
    { 
     Console.WriteLine(match.Groups[1].Value); 
    } 
    match = match.NextMatch(); 
} 

Ausgang:

Berkshire Hathaway Inc 
Ticker: DIS 
+0

ha. Ich mag diese Lösung, weil es einfach ist. –

+0

Sie können Bedingungslogik für Gruppen nicht gleichzeitig verwenden. Reguläre Ausdrücke sind dazu gedacht, den Text einfach zu analysieren, wie es ist –

+1

@ JustinPihony Danke für den Tipp! Immer gerne erhalten :) – Robbie

2

Ich würde vorschlagen, ein Werkzeug wie Expresso zu verwenden, um Ihre regulären Ausdrücke auszuarbeiten. Es ist für C# Regex konzipiert und kopiert sogar den Code, den Sie verwenden müssen, in Ihre Zwischenablage. Sie können Ihr Beispiel in das Werkzeug einfügen und dann Ihren regulären Ausdruck optimieren, bis er funktioniert. Ich finde ein Werkzeug wie dieses zum Schreiben von regulären Ausdrücken.

+0

Ich verwende [Rad-Software] (http://www.radsoftware.com.au/?from=RegexDesigner) und Es hilft beim Testen, aber ich bin immer noch neu bei Regex, daher bin ich mir nicht sicher, ob ich die Syntax schon verstehe. –

+0

Regex Buddy ist zwar nicht frei auch super –