2016-03-30 23 views
1

Ich habe eine Zeichenfolge, die dieses Muster folgt:A RegEx Match Dieser

junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk 

Der junk Text stellt unbekannten Text, den ich nicht interessiert bin an und will nicht abgestimmt.

FISH und die alle vorwärts Schrägstriche repräsentieren bekannten Text, die ich nicht durch die RegEx übereinstimmen möchte.

NOTJUNK1 steht für einen unbekannten Text, den ich tun kümmern und wollen abgestimmt werden. Die -Z32 wird nach NOTJUNK1 auftreten, wie gezeigt. Ich weiß, dass es eine -Z geben wird, aber ich kenne die zweistellige Zahl nicht, die folgt. Es könnte sogar eine Ziffer sein. Ich möchte den ein- oder zweistelligen Wert als eine Übereinstimmung zurückgegeben (aber ich möchte nicht -Z).

Schließlich stellt NOTJUNK2 auch einige unbekannte Text, die ich tun kümmern und wollen zurückgegeben werden.

Ich verwende die RegEx in der .NET-Bibliothek.

So, am Beispiel Zeichenfolge oben, würde ich drei Spiele mögen, wenn möglich:

NOTJUNK1 
32 
NOTJUNK2 

Der nächstgelegene ich kam, war dieser RegEx: (?<=FISH/.+/.+/).*?(?=-m[0-9]{1,2}/)?/

Es gibt zwei Spiele (die nahe , aber nicht das, was ich will):

NOTJUNK1-Z32/ 
NOJUNK2/ 
+1

Was [ '/ FISH/[^ /] +/[^ /] +/([^ /] *?) -Z (\ d +)/([^ /] +) '] (http://regexstorm.net/tester?p=%2fFISH%2f%5b%5e%2f%5d%2b % 2f% 5b% 5e% 2f% 5d% 2b% 2f (% 5b% 5e% 2f% 5d *% 3f) -Z (% 5cd% 2b)% 2f (% 5b% 5e% 2f% 5d% 2b) & i = junk% 2fFISH% 2fjunk% 2fjunk% 2fNOTJUNK1-Z 32% 2fNOJUNK2% 2fjunk)? Die 3 erfassten Werte sind "NOTJUNK1", "32" und "NOJUNK2". –

Antwort

1

Sie einfangenden Gruppen wie diese verwenden können, entsprechen.

Regex:(?:.*?\/){4}(.*)-Z(\d{1,2})\/(.*)\/

Erläuterung:

  • (?:.*?\/){4} Matches die unnecessary Daten und vier Schrägstriche.

  • (.*) entspricht der NOTJUNK1.

  • -Z(\d{1,2}) entspricht one oder two Ziffern nach -Z.

  • (.*) passt die NOJUNK2

Verwenden Rückreferenzierung Zahlen \1 für NOTJUNK1, \2 für 32 (d.h Zahl nach -Z), \3 für NOJUNK2.

Regex101 Demo

+0

Muss nicht sichergestellt werden, dass '/ FISH /' in der Eingabe vorhanden ist? – anubhava

+0

@anubhava: Wie OP erwähnt _FISH und die alle vorwärts Schrägstriche repräsentieren bekannten Text, den ich nicht von der RegEx.angepasst werden möchte. So 'FISH' ist nicht wesentlich. Nur '/' Schrägstriche sind wichtig. Lass es mich wissen, wenn ich es falsch verstanden habe. –

+0

Ich denke, '/ FISH /' wird nicht in übereinstimmenden Daten benötigt, aber es muss immer noch in der Eingabe – anubhava

1
/FISH/[^/]*/[^/]*/([^/]*)-Z(\d+)/([^/]+) 

Hier ist die DEMO

0

versuchen diese

string textMatch = "junk/FISH/junk/junk/NOTJUNK1-Z32/NOJUNK2/junk"; 
     Regex r = new Regex(@"/(?<req1>.*?)-Z(?<req2>.*?)/(?<req3>.*?)/", RegexOptions.RightToLeft); 
     MatchCollection mcKVPs = r.Matches(textMatch); 
     var kvps = from Match m in mcKVPs 
        where mcKVPs != null 
        where mcKVPs.Count > 0 
        select new 
        { 
         val1 = m.Groups["req1"].Value, 
         val2 = m.Groups["req2"].Value, 
         val3 = m.Groups["req3"].Value 
        }; 
     var kvp = kvps.FirstOrDefault(); 
+0

'RightToLeft' wird in diesem Fall keine Kante zum Matching geben. Es ist überflüssig. –

+0

Wenn Sie nicht rechts nach links setzen, wird es von links beginnen und mehr '/' und out put von req1 =/FISH/junk/junk/NOTJUNK1 – Krishna

+0

übereinstimmen. Deshalb sollten Sie mit '/ FISH /' beginnen. –